版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、參考文檔: HYPERLINK /software/BeautifulSoup/bs4/doc.zh/ Beautiful Soup 4.2.0中文文檔BeautifulSoup是一個(gè)可以從html或者xml文件中提取數(shù)據(jù)的一個(gè)Python第三方庫(kù)。我們可以在編寫爬 蟲項(xiàng)目的時(shí)候,使用BeautifulSoup來(lái)幫助我們解析html文件。 o 1、安裝 BeautifulSoup-2、安裝解析器 3、使用 BeautifulSoup3.1、編碼問(wèn)題3.2、BeautifulSoup的對(duì)象3.2.1、Tag對(duì)象.parents & .parent.contents & .children.str
2、ing.strings & .stripped_stringsget_text()3.2.2、NavigableString對(duì)象3.3、搜尋目標(biāo)Tag3.3.1、過(guò)濾器字符串-正則表達(dá)式-列表-函數(shù)方法3.3.2、find_all()name參數(shù)attr s參數(shù)keyword 參數(shù)按css搜索string 參數(shù)limit參數(shù)recursive 參數(shù)find_all()方法的簡(jiǎn)寫3.3.3、find()find()方法的使用find()方法的簡(jiǎn)寫-3.3.4、其他搜索APIfind_parents() & find_parent()find_next_siblings() & find_next
3、_sibling()find_previous_siblings() & find_previous_sibling()find_all_next() & find_next()find_all_previous() & find_previous() 3.3.5、css選擇器 4、如何提高效率解析部分文檔(SoupStrainer)文檔解析錯(cuò)誤代碼診斷(diagnose)-5、使用更高版本應(yīng)注意的內(nèi)容1、安裝 BeautifulSoupPython的第三方庫(kù)一般都可以使用pip來(lái)進(jìn)行安裝,使用pip進(jìn)行安裝的方法是:pip install beautifulsoup4也可以使用easy_in
4、stall來(lái)進(jìn)行安裝:easy_install beautifulsoup4BeautifulSoup的發(fā)布協(xié)議允許將bs4的代碼打包在項(xiàng)目中,可以無(wú)須安裝便可以使用。2、安裝解析器BeautifulSoup支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器(html.parser無(wú)需安裝),也支持一些第三方的解 析器,其中一個(gè)是lxml,也支持html5lib, html5lib是純Python實(shí)現(xiàn),解析方式與瀏覽器相同解析器的安裝和BeautifulSoup的安裝類似:easy_install lxmlpip install lxmleasy_install html5libpip install
5、html5lib各個(gè)解析器的對(duì)比如下:解析器使用方法優(yōu)勢(shì)劣勢(shì)Python標(biāo)準(zhǔn)庫(kù)BeautifulSoup (markup, Python的內(nèi)置標(biāo) Python 2.7.3 orhtml.parser )3.2.2)前的版本執(zhí)彳亍速度適中中文檔容錯(cuò)能力文檔容錯(cuò)能力強(qiáng)差I(lǐng)xml HTML解析器BeautifulSoup(markup,速度快需要安裝C語(yǔ)言庫(kù)Ixml )文檔容錯(cuò)能力強(qiáng)IxmlXML解析器BeautifulSoup (markup,灘快需要安裝C語(yǔ)言庫(kù)唯一支持XML的解析器Beau tiful Sou p (tna rkup,*xmr)htrnl5libBeau tiful Sou p
6、 (ma rkup,*html51ib*)-最好的容錯(cuò)性-速度慢以瀏覽器的方式不依賴外部擴(kuò)展解析文檔生成HTML5格式的文檔推薦使用Ixml作為解析器,因?yàn)樾矢摺T赑ython2.7.3之前的版本和Python3中322之前的版本, 必須安裝I xml或htm I5I ib,因?yàn)槟切㏄ython版本的標(biāo)準(zhǔn)庫(kù)中內(nèi)置的HTML解析方法不夠穩(wěn)定。3、使用 BeautifulSoup使用BeautifulSoup的方法和其他Python庫(kù)的方法類似from bs4 import BeautifulSoup 我們可以將我們采集到的網(wǎng)頁(yè)內(nèi)容傳入BeautifulSoup的構(gòu)造方法,就能得到一個(gè)文檔的對(duì)
7、象,也可 以傳入一段字符串或一個(gè)文件句柄。soup = BeautifulSoup(html,html.parser)soup = BeautifulSoup(open(html.html,),html.parser)soup = BeautifulSoup(,data,,html.parser,)我們需要注意到,文檔在傳入構(gòu)造方法之后均被轉(zhuǎn)換成Unicode,并且HTML的實(shí)例都被轉(zhuǎn)換成 Unicode 編碼。3.1、編碼問(wèn)題任何HTML或XML文檔都有自己的編碼方式,比如ASCII或UTF-8,但是使用BeautifulSoup解析后, 文檔都被轉(zhuǎn)換成了 Unicode。Beautiful
8、Soup用了編碼自動(dòng)檢測(cè)子庫(kù)來(lái)識(shí)別當(dāng)前文檔編碼并轉(zhuǎn)換成Unicode編碼。BeautifulSoup對(duì) 象的.original_encoding屬性記錄了自動(dòng)識(shí)別編碼的結(jié)果。也可以通過(guò)from_encoding屬性來(lái)指定編碼 格式。soup = BeautifulSoup(html,from_encoding=,utf-8,)我們?cè)诰帉懪老x的時(shí)候,一般都會(huì)遇到中文編碼的顯示問(wèn)題,一般我們是將request s的返回,傳入 BeautifulSoup的構(gòu)造方法中,有時(shí)候會(huì)出現(xiàn)中文亂碼的情況,我們這里以百度官網(wǎng) 為例,看一下怎么解決編碼問(wèn)題。import requestsfrom bs4 impo
9、rt BeautifulSoupres = requests.get(,)print(res.encoding)soup = BeautifulSoup(res.text,,lxml,)print(soup)print(soup.original_encoding)當(dāng)我們運(yùn)行上面這些代碼的時(shí)候,我們會(huì)發(fā)現(xiàn)我們輸出的soup是亂碼。我們查看requestes以及 BeautifulSoup的相關(guān)文檔,發(fā)現(xiàn)request s會(huì)自動(dòng)將從服務(wù)器端獲取到的內(nèi)容自動(dòng)轉(zhuǎn)換成unicode,而 BeauifulSoup也會(huì)將獲取到內(nèi)容自動(dòng)轉(zhuǎn)換成unicode。requests和BeautifulSoup會(huì)自行
10、猜測(cè)原文的編 碼格式,大多數(shù)時(shí)候猜測(cè)出來(lái)的編碼都是正確的,但也有猜錯(cuò)的情況,如果猜錯(cuò)了可以指定原文的編 碼。所以我們認(rèn)為是上面是由于編碼格式猜測(cè)錯(cuò)誤導(dǎo)致的中文亂碼,我們查看res.encoding的輸出結(jié)果 為ISO-8859-T,然后在網(wǎng)頁(yè)中的charset屬性指出網(wǎng)頁(yè)是utf-8編碼格式的,所以我們需要指定原文 的編碼:res.encoding = ,utf-8,然后再傳入BeautifulSoup中,我們輸出的soup時(shí)中文顯示就正常了。我們?cè)谕ㄟ^(guò)BeautifulSoup輸出文檔時(shí),不管輸入文檔是什么編碼方式,輸出編碼均為utf-8編碼。如 果我們不想使用utf-8格式輸出文檔,或者因
11、為有些字符亂碼而需要使用其他編碼格式的時(shí)候,那我 們只需要:soup.encode(,你想要的編碼,)#orsoup.prettify(,你想要的編碼,)#prettify()除了可以指定編碼外,最主要功能是對(duì)beautifulsoup的k語(yǔ)法分析樹重新排版ps:針對(duì)中文編碼問(wèn)題,我們也可以以bytes傳遞給BeautifulSoup,-般bs都能猜測(cè)到正確的編碼。import reuqestsfrom bs4 import BeautifulSoupres = requests.get()soup = BeautifulSoup(res.content,lxml)print(soup.pre
12、ttify()輸出中文正常顯示。3.2、BeautifulSoup的對(duì)象BeautifulSoup將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸為 4種:Tag, NavigableString, BeautifulSoup, Comment。我們?cè)诰帉懪老x代碼的時(shí)候主要使用的是 Tag和NavigableString對(duì)象,所以著重介紹一下。我們使用bs的最重要的目的是解析html文檔,從里 面提取出我們所需要的內(nèi)容,當(dāng)然bs還有很多其他非常好的功能。3.2.1、Tag對(duì)象Tag對(duì)象與XML或HTML原生文檔中的tag相同,我們也可以認(rèn)為是樹形結(jié)構(gòu)中的節(jié)點(diǎn)。
13、一個(gè)Tag可能 包含多個(gè)字符串或其它的Tag,這些都是這個(gè)Tag的子節(jié)點(diǎn)。Beautiful Soup提供了許多操作和遍歷子 節(jié)點(diǎn)的屬性.我們可以通過(guò).tag_name的方法來(lái)獲得子節(jié)點(diǎn),但是這種方法只能獲得第一個(gè)匹配到的節(jié)點(diǎn)。soup = BeautifulSoup(vb id=bold class=boldestExtremely bold) tag_b = soup.b type(tag_b)#每個(gè)tag都有自己的名字,可以通過(guò).name來(lái)獲?。簍ag_#b個(gè)tag可能有很多個(gè)屬性,例如tag_b有一個(gè)“id”的屬性,值為“blod”,有一個(gè)“class”的屬性,值 為“boldest”
14、 , tag的屬性的操作方法與字典相同。也可以通過(guò)使用.attrs的方式,獲得所有的屬 性。HTML4定義了一系列可以包含多個(gè)值的屬性,在HTML5中移除了一些,卻增加更多,最常見的多值 的屬性是class (tag可以有多個(gè)CSS的class),還有一些屬性rel, rev, accept-charset, headers, accesskey等等。在BeautifulSoup中多值屬性的返回類型是list。tag_bclass#boldesttag_b.attrs#id: bold, class: boldest)css_soup = BeautifulSoup() css_soup.pc
15、lass#bodyt strikeout.parents & .parenttag對(duì)象的.parent屬性,可以獲取某個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)。例如,head標(biāo)簽是title標(biāo)簽的父節(jié)點(diǎn), 我們可以這么獲得。title_tag = soup.titletitle_tag#This is a storyv/titletitle_tag.parent#This is a storytag對(duì)象的.parents屬性是遞歸返回當(dāng)前tag對(duì)象的所有父輩節(jié)點(diǎn)。.contents & .childrentag的.contents屬性可以將tag的子節(jié)點(diǎn)以列表的方式輸出:soup = BeautifulSoup(Ext
16、remely bold123) soup.a.contents#Extremely bold, 123也可以通過(guò)tag的.children生成器,對(duì)tag的子節(jié)點(diǎn)進(jìn)行循環(huán):for child in soup.a.children:print(child)#Extremely bold#123.string如果tag只有一個(gè)NavigableString類型子節(jié)點(diǎn),也就是只有一個(gè)字符串節(jié)點(diǎn),沒(méi)有其他tag,那么這 個(gè)tag可以使用.string得到子節(jié)點(diǎn):soup.a.b.stringExtremely bold.strings & .stripped_strings如果tag中包含多個(gè)字符串,
17、可以使用.strings來(lái)循環(huán)獲取:soup = BeautifulSoup( Extremely boldv/bxb class=boldestExtremely bold1n123)for string in soup.a.strings:print(string)#Extremely bold#Extremely boldl#123輸出的字符串中可能包含了很多空格或空行,使用.stripped_strings可以去除多余空白內(nèi)容:soup = BeautifulSoup(Extremely boldExtremely bold1n123)for string in soup.a.stri
18、pped_strings:print(string)#Extremely bold#Extremely boldl#123get_text()如果只想得到tag中包含的文本內(nèi)容,那么可以調(diào)用get_text()方法,這個(gè)方法獲取到tag中包含的所有 文字內(nèi)容包括子孫tag中的內(nèi)容,并將結(jié)果作為Unicode字符串返回:soup = BeautifulSoup(Extremely bold123) soupaget_text()soupa.b.get_text()#Extremely bold123#Extremely bold注意:Beautiful Soup中字符串節(jié)點(diǎn)不支持以上這些屬性,因
19、為字符串沒(méi)有子節(jié)點(diǎn)3.2.2、NavigableString對(duì)象字符串常被包含在tag內(nèi),Beautiful Soup用NavigableString類來(lái)包裝tag中的字符串。一個(gè) NavigableString字符串與Python中的U nicode字符串相同。tag中包含的字符串不能編輯,但是可以被替換成其它的字符串,用replace_with()方法:soup = BeautifulSoup(123,)soup.b.string.replace_with(replace,)soup.b#replace注:一個(gè)字符串不能包含其它內(nèi)容(tag能夠包含字符串或是其它tag),字符串不支持.co
20、ntents或 .string屬性或find()方法。3.3、搜尋目標(biāo)Tag在我們獲得正確的網(wǎng)頁(yè)返回內(nèi)容之后,我們需要搜尋到正確的目標(biāo)Tag來(lái)獲得我們想要的內(nèi)容。 Beautiful Soup定義了很多搜索方法,這里著重介紹2個(gè):find()和find_all(),其它方法的參數(shù)和用法 類似。3.3.1、過(guò)濾器介紹find_all()方法前,先介紹一下過(guò)濾器的類型,這些過(guò)濾器貫穿整個(gè)搜索的API。過(guò)濾器可以被用 在tag的name中,節(jié)點(diǎn)的屬性中,字符串中或他們的混合中。我們使用下面的html,作為我們解析的內(nèi)容html =,123456321654 I Isoup = BeautifulSo
21、up(html)字符串最簡(jiǎn)單的過(guò)濾器是字符串,在搜索方法中傳入一個(gè)字符串參數(shù),Beautiful Soup會(huì)查找與字符串完整 匹配的內(nèi)容,下面的例子用于查找文檔中所有的標(biāo)簽:soup.find_all(b)#123f 456v/b, 321f 654字符串過(guò)濾器的主要功能是篩選出=字符串的節(jié)點(diǎn)正則表達(dá)式如果傳入正則表達(dá)式作為參數(shù),Beautiful Soup會(huì)通過(guò)正則表達(dá)式的match()來(lái)匹配內(nèi)容。下面例子 中找出所有以b開頭的標(biāo)簽,這表示和標(biāo)簽都應(yīng)該被找到:import refor tag in soup.find_all(pile(b):print()#body#b#b#b#b列表如果傳
22、入列表參數(shù),Beautiful Soup會(huì)將與列表中任一元素匹配的內(nèi)容返回。下面代碼找到文檔中所 有標(biāo)簽和標(biāo)簽:soup.find_all(a,b)#123456 , 123, 456, 321654, 321, 654函數(shù)方法如果沒(méi)有合適過(guò)濾器,那么還可以定義一個(gè)方法,方法只接受一個(gè)元素參數(shù),如果這個(gè)方法返回 True表示當(dāng)前元素匹配并且被找到,如果不是則反回False。下面方法校驗(yàn)了當(dāng)前tag,如果包含class屬性卻不包含id屬性,那么將返回True:def has_class_but_no_id(tag):return tag.has_attr(class) and not tag.h
23、as_attr(id)將這個(gè)方法作為參數(shù)傳入find_all()方法,將得到所有滿足條件的標(biāo)簽:soup.find_all(has_class_but_no_id)#456f 654v/b可以看到返回結(jié)果中,只有滿足含有class屬性,不含有id屬性”的標(biāo)簽被返回。3.3.2、 find_all()find_all( name , attrs , recursive , text , *kwargs )find_all()方法搜索當(dāng)前tag的所有tag子節(jié)點(diǎn),并判斷是否符合過(guò)濾器的條件。下面有幾個(gè)例子,根據(jù) find_all()方法的參數(shù),進(jìn)行理解。name參數(shù)name參數(shù)在之前的介紹中有所提
24、及,類似字符串過(guò)濾器。name參數(shù)查找所有名字為name的tag, 字符串對(duì)象會(huì)被自動(dòng)忽略掉。soup.find_all(title)茸獲得為“title ”的標(biāo)簽attrs參數(shù)attrs參數(shù)是根據(jù)tag屬性,對(duì)標(biāo)簽進(jìn)行查找。soup.find_all(attrs=class:bl)#獲得滿足class=bU的所有標(biāo)簽soup.find_all(b,attrs=class:b1,id=bold1)#獲得滿足class=b1” id=%old1 的所有標(biāo)簽keyword 參數(shù)如果一個(gè)指定名字的參數(shù)不是搜索內(nèi)置的參數(shù)名,搜索時(shí)會(huì)把該參數(shù)當(dāng)作指定名字tag的屬性來(lái)搜 索,如果包含一個(gè)名字為id的參數(shù)
25、,Beautiful Soup會(huì)搜索每個(gè)tag的” id”屬性。soup.find_all(id=link2)#搜尋所有滿足id=link2 的標(biāo)簽如果傳入href參數(shù),Beautiful Soup會(huì)搜索每個(gè)tag的”href”屬性:soup.find_all(href=pile(https:/)#搜尋所有href為https開頭的標(biāo)簽搜索指定名字的屬性時(shí)可以使用的參數(shù)值包括字符串,正則表達(dá)式,列表,True,參照過(guò)濾器的使用 方法。soup.find_all(id=True)茸搜索查找所有包含id屬性的標(biāo)簽,無(wú)論id的值是什么可以使用多個(gè)指定名字的參數(shù)可以同時(shí)過(guò)濾tag的多個(gè)屬性:soup.
26、find_all(href=pile(https:/),id=link,)#搜索查找所有id為link href為https開頭的標(biāo)簽注意:有些tag屬性不能在搜索中使用,例如html5中的data-*屬性soup = BeautifulSoup(,foo!,)soup.find_all(data-foo = value)#SyntaxError: keyword cant be an expression但是可以通過(guò)使用find_all()方法中的attrs參數(shù)來(lái)獲得data-*的屬性內(nèi)容soup.find_all(attrs=,data-foo,:value,)#foo!按css搜索按照c
27、ss類名搜索tag的功能非常實(shí)用,但標(biāo)識(shí)css類名的關(guān)鍵字class在Python中是保留字,使用 class做參數(shù)會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。從BeautifulSoup的4丄1版本開始,可以通過(guò)class_參數(shù)搜索有指定 css類名的tag。soup.find_all(,a,,class_=,test,)茸搜索出所有class屬性為test的標(biāo)簽class_參數(shù)同樣接受不同類型的過(guò)濾器,例如:字符串,正則表達(dá)式,函數(shù)方法以及True。使用方 法和上面在講過(guò)濾器的時(shí)候的使用方法類似,我們可以自行驗(yàn)證。tag的class是多值屬性,按照css類名搜索tag的時(shí)候,可以分別搜索tag中的每個(gè)類名。soup
28、= BeautifulSoup(,)soup.find_all(,p,,class_=,body,)#v/psoup.find_all(,p,,class_=,table,) #v/p 同時(shí)使用class_也可以進(jìn)行對(duì)css類名的完全匹配: soup.find_all(p,class_=bGdy tabel) #p class=body注意:如果在使用完全匹配clas s值的時(shí)候,如果css類名的順序與實(shí)際不符,則不會(huì)搜索到正確的結(jié) 果。string參數(shù)通過(guò)string參數(shù)可以搜索文檔中的字符串內(nèi)容,它同樣接受不同類型的過(guò)濾器,string參數(shù)接受字符 串,正則表達(dá)式,列表和True,同樣也接
29、受函數(shù)方法過(guò)濾。注意:如果只使用了string參數(shù),返回結(jié)果列表中的元素只包含滿足搜索條件的字符串,也可以說(shuō)是 NavigableString對(duì)象,而不是tag對(duì)象,可以觀察下面的這兩個(gè)語(yǔ)句進(jìn)行對(duì)比。soup.find_all(string = test)#testsoup.find_all(a,string=test)#testlimit參數(shù)find_all()方法返回的是全部的搜索結(jié)構(gòu),那么如果文檔樹很大的時(shí)候搜索所需要的時(shí)間也會(huì)非常 大,如果我們不需要全部的搜索結(jié)果,那么我們可以使用limit參數(shù)來(lái)限制返回結(jié)果的數(shù)量。例如如果文檔中有5個(gè)滿足搜索條件的tag,當(dāng)我們使用limit參數(shù)的時(shí)
30、候就可以限制它的返回?cái)?shù)量。soup.find_all(a,limilt=2)#只返回滿足搜索條件的前兩個(gè)recursive 參數(shù)在調(diào)用find_all()方法時(shí),默認(rèn)的是搜索當(dāng)前tag下的所有子孫節(jié)點(diǎn),查找符合我們要求的tag。如果 我們只想搜索當(dāng)前tag的直接子節(jié)點(diǎn),可以使用參數(shù)recursive = Falsehtml = Test Title!soup = BeautifulSoup(html,lxml)souphtmlfind_all(title)#The Dormouses storysouphtmlfind_all(title,recursive二False)#標(biāo)簽在標(biāo)簽下,但并不
31、是直接子節(jié)點(diǎn),標(biāo)簽才是直接子節(jié)點(diǎn)。在允許查詢 所有后代節(jié)點(diǎn)時(shí)BeautifulSoup能夠查找到標(biāo)簽。但是使用了 recursive=False參數(shù)之后, 只能查找直接子節(jié)點(diǎn),這樣就查不到標(biāo)簽了。find_all()方法的簡(jiǎn)寫find_all()方法是BeautifulSoup中最常用的搜索方法,所以BeautifulSoup的作者定義了他的簡(jiǎn)寫方 法,BeautifulSoup對(duì)象和tag對(duì)象可以被當(dāng)作一個(gè)方法來(lái)使用,這個(gè)方法的執(zhí)行結(jié)果和調(diào)用這個(gè)對(duì)象 的find_all()方法的結(jié)果相同。soup.find_all(a)soup(a)上面的這兩行代碼的執(zhí)行結(jié)果是一樣的,同樣下面的這兩行代碼的
32、執(zhí)行結(jié)果也是一樣的。soup.title.find_all(string=True)soup.title(string=True)3.3.3、 find()find( name , attrs , recursive , string , *kwargs)find()方法的使用find()方法的參數(shù)使用與find_all()的類似,這里不再重新闡述。find_all()方法將返回文檔中所有符合條件的tag,當(dāng)我們只想得到一個(gè)結(jié)果時(shí),可以使用limit參數(shù), 或者可以直接使用find()方法,例如下面的兩行代碼是等價(jià)的。soup.find_all(title,limit=1)soup.find(
33、title)上面兩行代碼唯一的區(qū)別就是,find_all()方法返回的是包含一個(gè)元素的列表,而find()方法是直接 返回的結(jié)果。如果沒(méi)有找到滿足搜索條件的tag對(duì)象,findl()返回的是一個(gè)空列表,find()找不到 目標(biāo)返回的是None。find()方法的簡(jiǎn)寫soup.head.title是調(diào)用find()方法的簡(jiǎn)寫,這個(gè)簡(jiǎn)寫的原理就是多次調(diào)用當(dāng)前tag的find()方法,下 面這兩句代碼是具有相同效果的。soup.head.titlesoup.find(head).find(title)3.3.4、其他搜索APIfind()和find_all()方法是最常使用的搜索文檔的方法,但是Be
34、autifulSoup還給我們提供了 10個(gè)可以 使用搜索功能的API,其中五個(gè)與find_all()方法的參數(shù)相同,另外五個(gè)與find()方法的參數(shù)類似,這 里不再做舉例驗(yàn)證。find_parents() & find_parent()find_parents(name, attrs, recursive, string, *kwargs)find_parent(name, attrs, recursive, string, *kwargs)find()和find_all()方法是搜索當(dāng)前節(jié)點(diǎn)的子孫節(jié)點(diǎn),find_parent()和find_parents()則是用來(lái)搜索 當(dāng)前節(jié)點(diǎn)的父輩節(jié)點(diǎn)
35、。同樣兩個(gè)方法的區(qū)別是,在參數(shù)缺省的時(shí)候,find_parent()只返回直接父親 節(jié)點(diǎn)(1個(gè)),find_parents()迭代返回所有的父輩節(jié)點(diǎn)。find_next_siblings() & find_next_sibling()find_next_siblings(name, attrs, recursive, string, *kwargs)find_next_sibling(name, attrs, recursive, string, *kwargs)這兩個(gè)方法通過(guò).next_siblings屬性對(duì)當(dāng)前tag節(jié)點(diǎn)后面所有滿足搜索條件的兄弟tag節(jié)點(diǎn)進(jìn)行迭代, 兩個(gè)方法的區(qū)別是fin
36、d_next_siblings()返回所有滿足搜索條件的兄弟節(jié)點(diǎn),find_next_sibling()只 返回滿足搜索條件的第一個(gè)兄弟節(jié)點(diǎn)。find_previous_siblings() & find_previous_sibling()find_previous_siblings(name, attrs, recursive, string, *kwargs)find_previous_sibling(name, attrs, recursive, string, *kwargs)這兩個(gè)方法是通過(guò).previous_siblings屬性對(duì)當(dāng)前tag節(jié)點(diǎn)前面所有滿足搜索條件的兄弟tag節(jié)點(diǎn)
37、進(jìn)行迭 代,兩個(gè)方法的區(qū)別是find_previous_siblings()返回所有滿足搜索條件的兄弟節(jié)點(diǎn), find_previous_sibling()只返回滿足走索條件的第一個(gè)兄弟節(jié)點(diǎn)。find_all_next() & find_next()find_all_next(name, attrs, recursive, string, *kwargs)find_next(name, attrs, recursive, string, *kwargs)這2個(gè)方法通過(guò).next_elements屬性對(duì)當(dāng)前節(jié)點(diǎn)之后的tag和字符串進(jìn)行迭代,find_all_next()方法 返回所有符合條件的節(jié)
38、點(diǎn),find_next()方法返回第一個(gè)符合條件的節(jié)點(diǎn)。find_all_previous() & find_previous()find_all_previous(name, attrs, recursive, string, *kwargs)find_previous(name, attrs, recursive, string, *kwargs)這2個(gè)方法通過(guò).previous_elements屬性對(duì)當(dāng)前節(jié)點(diǎn)前面的tag和字符串進(jìn)行迭代, find_all_previous()方法返回所有符合條件的節(jié)點(diǎn),find_previous()方法返回第一個(gè)符合條件的節(jié) 點(diǎn)。3.3.5、css選擇
39、器BeautifulSoup支持大部分的CSS選擇器,在tag或者BeautifulSoup對(duì)象的.select。方法中傳入字符 串,就可以使用css選擇器的語(yǔ)法找到目標(biāo)tag。熟練使用css的人,可以選擇使用css選擇器來(lái)進(jìn)行搜索。css選擇器的使用方法,可以自行查找官方文檔的相關(guān)使用,本人由于掌握的不好,便不在這里班門 弄斧了。4、如何提高效率BeautifulSoup解析文檔的速度不會(huì)比它所依賴的解析器的速度更快,如果對(duì)時(shí)間要求比較高,那我 們應(yīng)該直接使用lxml作為BeautifulSoup所依賴的解析器,用lxml作解析器比用html5lib或者 python的內(nèi)置解析器速度要快很多
40、。在安裝c chardet后對(duì)文檔解碼的編碼檢測(cè)也會(huì)更快。此外一個(gè)更好提高速率的方法是,解析部分文檔雖然不會(huì)節(jié)省多少解析時(shí)間,但是會(huì)節(jié)省很多內(nèi)存, 并且搜索時(shí)也會(huì)變得更快。解析部分文檔(SoupStrainer)如果僅僅是想查找文章中的a標(biāo)簽而對(duì)整個(gè)文檔進(jìn)行解析,實(shí)在是浪費(fèi)內(nèi)存和時(shí)間,最快的方法是 從一開始就將出了a標(biāo)簽之外的內(nèi)容都忽略掉。SoupStrainer類可以定義文檔的某段內(nèi)容,這樣 搜索文檔時(shí)就不必解析整個(gè)文檔,只會(huì)解析在SoupStrainer中定義過(guò)的文檔。這樣我們只需要構(gòu)建 個(gè)SoupStrainer對(duì)象,并作為parse_only的參數(shù)傳遞個(gè)BeautifulSoup構(gòu)造方
41、法即可。SoupStrainer 具有與典型搜索方法相同的參數(shù),name, attrs, recursive, string, *kwargs,下面 舉例說(shuō)明三種SoupStrainer對(duì)象。from bs4 import SoupStraineronly_a_tags = SoupStrainer(a)only_tags_with_id_link2 = SoupStrainer(id=link2)def is_short_string(string):return len(string) vtitleThe Dormouses storyv/titlev/headThe Dormouses
42、storyv/bx/pOnce upon a time there were three little sisters; and their names wereElsie,Lacie andTillie;and they lived at the bottom of a well.v/pprint(BeautifulSoup(html_doc,lxml,parse_only=only_a_tags).prttify()#a class=sister href= HYPERLINK /elsie /elsie id=link1uElsie#Lacie#Tillie#print(Beautifu
43、lSoup(html_doc,lxml,parse_only=only_tags_with_id_link2).prettify()#Lacie#print(BeautifulSoup(html_doc,lxml,parse_only=only_short_strings).prettify()#Elsie#,#Lacie#and#Tillie此外還可以將S oupstrainer傳入搜索方法中,可以實(shí)現(xiàn)同樣的效果soup = BeautifulSoup(html_doc,) print(soup.find_all(only_short_strings)nf Elsie, fnf Lacie, andnf Tillie, nfn文檔解析錯(cuò)誤文檔解析錯(cuò)誤有兩種,一種是崩潰,BeautifulSoup嘗試解析一段文檔結(jié)果卻拋除了異常,通常是 HTMLParser.HTMLParseError。還有一種異常情況是Beaut
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度班組承包合同履行期限與合同解除3篇
- 2025年度池塘生態(tài)漁業(yè)項(xiàng)目租賃合同3篇
- 二零二五版幼兒園連鎖經(jīng)營(yíng)承包管理服務(wù)合同3篇
- 二零二五年股權(quán)融資合同聚焦新能源領(lǐng)域3篇
- 二零二五年度大渡口環(huán)保吸污車租賃與市場(chǎng)推廣服務(wù)協(xié)議3篇
- 2025年數(shù)據(jù)中心物業(yè)承包經(jīng)營(yíng)合同模板3篇
- 2024版商用建筑項(xiàng)目合作合同精簡(jiǎn)版版B版
- 個(gè)性化2024勞務(wù)派遣服務(wù)協(xié)議版B版
- 二零二五版旅游項(xiàng)目投資擔(dān)保合同3篇
- 2025年房屋租賃續(xù)租協(xié)議2篇
- 二年級(jí)下冊(cè)加減混合豎式練習(xí)360題附答案
- GB/T 21709.5-2008針灸技術(shù)操作規(guī)范第5部分:拔罐
- 大三上-診斷學(xué)復(fù)習(xí)重點(diǎn)
- 應(yīng)收賬款的管理培訓(xùn)課件
- 2021年道路交通安全法期末考試試題含答案
- 股東變更情況報(bào)告表
- 自帶藥物治療告知書
- 房產(chǎn)中介門店6S管理規(guī)范
- 吞咽解剖和生理研究
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
- 異地就醫(yī)備案?jìng)€(gè)人承諾書
評(píng)論
0/150
提交評(píng)論