對於BeautifulSoup中的方法,find/findAll()爲一組函數,經過不一樣的參數進行重載。此處沒太多書上的含糊細節,具體知識點都在代碼註釋行。html
須要注意的是,Python的註釋分爲:#單行註釋
python
''' 多行註釋 '''。可是通過試驗,發現不能有多個多行註釋。正則表達式
網上的其餘註釋方案有:用""" """定義多行字符串進行註釋express
#根據特定tag和屬性,來搜索定位 from urllib.request import urlopen from bs4 import BeautifulSoup html=urlopen("http://www.pythonscraping.com/pages/warandpeace.html") bsObj=BeautifulSoup(html,"html.parser") nameList=bsObj.find_all("span",{"class":"green"})#尋找被class=green渲染的文字, #findall(tag, attr) for name in nameList: print(name.get_text()) #打印被渲染的文字 #關於find()和findall()函數的說明 #findAll(tag, attr, recursive, text, limit, keywords) #find(tag, attr, recursive, text, keywords) #一、tag爲標籤,多個標籤:bsObj.findAll({"h1","h2","h3"})表示「or」關係 #二、attr爲標籤下的屬性,分「名」和「值」:{"name":"value"} # 多個屬性:bsObj.findAll{"class":"green", "class":"red"} #三、recursive:true表示查看子標籤;false表示只看頂層標籤。默認爲true #四、text:根據內容尋找tag,如查看prince出現的次數:nameList=bsObj.findAll(text="prince") # print(len(nameList)) #五、limit:限制查找次數,find()爲findAll()當limit=1時的特例。 #六、findAll()能夠指定特定的關鍵詞(keyword),此處爲多個關鍵詞爲「and」關係, #如 allText=bsObj.findAll(id="text") #print(allText[0].get_text()) #注意:用keyword的地方也能夠用其餘方式來產生相同的做用。同時,因爲class爲關鍵字,因此不能用下面方法: #bsObj.findAll(class="green") #但能夠:bsObj.findAll(class_="gree")或者bsObj.findAll("":{"class":"green"})
#BeautifulSoup中的對象:BeautifulSoup object, Tag object, NavigableString object, # Comment object(<!-- comment -->) # 直接訪問標籤:bsObj.div.findAll("img"),表示bsObj文檔中的第一個div標籤中尋找<img> from urllib.request import urlopen from bs4 import BeautifulSoup html=urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj=BeautifulSoup(html,"html.parser") for child in bsObj.find("table",{"id":"giftList"}).children: #children表示在table標籤下的子標籤 #children僅僅表示第一層子標籤,若是表示下面的子孫,則須要:descendants來表示 print(child)
#此處演示「兄弟標籤」 from urllib.request import urlopen from bs4 import BeautifulSoup html=urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj=BeautifulSoup(html,"html.parser") for sibling in bsObj.find("table",{"id":"giftList"}).tr.next_siblings: #此處打印多個兄弟節點,須要注意:一、此處的sibling不包括tr本省 #二、next_siblings向後順序查找,前面的siblings使用previous_siblings #三、next_sibling和previous_sibling只查找一個元素 print(sibling)
#尋找某個tag的parent from urllib.request import urlopen from bs4 import BeautifulSoup html=urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj=BeautifulSoup(html,"html.parser") print(bsObj.find("img",{"src":"../img/gifts/img1.jpg"}). parent.previous_sibling.get_text())
#此程序使用regular expression #regular expression = 特徵 + 數量 #在線檢測:RegexPal #郵件地址的正則表達式:[A-Za-z0-9_+]+@[A-Za-z0-9]+\.(com|org|edu|net) ''' 正則表達式中的12個符號: 一、*:出現0或屢次 二、+:出現1或屢次 三、[]:給定某個範圍,如[0-9] 四、():圈上某個組合,如(a*b)* 五、{m,n}:指明最少出現m此,最多出現n次 六、[^]:匹配不是範圍內的字符,如:[^A-Za-z],不是字母 七、|:表示或,如:a|b|c,出現或者是a,或者是b,或者是c 八、.:匹配任意一個字符 九、^:出如今字符串的開頭,如^a,a出如今字符串開頭 十、$:出如今字符串結尾,如a$,a爲倒數第一個字符。 十一、\:轉譯字符 十二、?!:表示不包含,如^((?![A-Z]).)*$,表示不包含大寫字母 ''' #下面程序用正則表達式來描述圖片路徑 from urllib.request import urlopen from bs4 import BeautifulSoup from bs4 import re html=urlopen("http://www.pythonscraping.com/pages/page3.html") bsObj=BeautifulSoup(html,"html.parser") images=bsObj.findAll("img",{"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")}) for image in images: print(image["src"])
#對於tag,能夠直接訪問其屬性:tag.attrs,如訪問圖片屬性:myImgTag.attrs['src'] #lambda expression:將函數值做爲參數,帶入另外一個函數中,如g(f(x),y) #findAll()容許使用lambda表示,可是須要被帶入的參數知足:該函數有一個tag參數 #返回值爲true #BeautifulSoup遇到的每一個tag都會在被帶入函數中處理,且返回的true的tag將被保留 #好比:soup.findAll(lambda tag:len(tag.attrs) == 2) ''' 對於兩個標籤:<div class="body" id="content"></div> <span style="color:red" class="title"></span> 則會返回 下面幾個庫實現和BeautifulSoup相同的功能: lxml HTML parser '''