摘要:本次介紹使用對(duì)文檔樹的遍歷。要注意的點(diǎn)在這里沒(méi)有屬性,因?yàn)樗峭?jí)節(jié)點(diǎn)中的第一個(gè)。字符串不是兄弟節(jié)點(diǎn)因?yàn)樗鼈兊母腹?jié)點(diǎn)不同。和通過(guò)和的迭代器可以向前或向后訪問(wèn)文檔的解析內(nèi)容。
上一篇文章介紹了 BeautifulSoup 的安裝以及基本對(duì)象類型。
本次介紹使用 bs4 對(duì) HTML 文檔樹的遍歷。
先把本文用到的例子貼上:
str = """bs4 test bs4 test
ab
"""
文檔樹的遍歷:
文檔樹的遍歷包括以下四部分:
子節(jié)點(diǎn)
父節(jié)點(diǎn)
兄弟節(jié)點(diǎn)
回退和前進(jìn)
一、子節(jié)點(diǎn)
一個(gè)標(biāo)簽可能包含多個(gè)字符串或者其他標(biāo)簽,這些標(biāo)簽都屬于子節(jié)點(diǎn)。要獲取子節(jié)點(diǎn),首先需要得到一個(gè) Tag 對(duì)象:
獲取一個(gè) Tag 對(duì)象最簡(jiǎn)單的方式是用 bs4 對(duì)象點(diǎn)上要獲取的標(biāo)簽的名字,同時(shí)支持鏈?zhǔn)秸{(diào)用。
bs4 = BeautifulSoup(str, "lxml") div_tag = bs4.div ul_tag = bs4.div.ul
.contents :
tag 對(duì)象的 .contents 屬性可以將 tag 的子節(jié)點(diǎn)以列表的方式輸出,不包含孫節(jié)點(diǎn):
ul_tag.contents # [" ",
字符串沒(méi)有 .contents 屬性,因?yàn)樽址疀](méi)有子節(jié)點(diǎn)。
.children:
.children 生成器,可以對(duì) tag 的直接子節(jié)點(diǎn)進(jìn)行循環(huán):
for child in ul_tag.children: print(child) #
.descendants:
.descendants 屬性可以對(duì)所有 tag 的子孫節(jié)點(diǎn)進(jìn)行遞歸循環(huán):
for child in ul_tag.descendants: print(child)
.string:
如果 tag 只有一個(gè) NavigableString 類型子節(jié)點(diǎn),那么這個(gè) tag 可以使用 .string 得到子節(jié)點(diǎn)。
title_tag = bs4.title print(title_tag.string) # bs4 test
如果一個(gè) tag 僅有一個(gè)子節(jié)點(diǎn),那么這個(gè) tag 也可以使用 .string 方法,輸出結(jié)果與當(dāng)前唯一子節(jié)點(diǎn)(也就是 title 節(jié)點(diǎn))的 .string 結(jié)果相同。
head_tag = bs4.head print(head_tag.string) # bs4 test
如果 tag 包含了多個(gè)子節(jié)點(diǎn),tag 就無(wú)法確定 .string 方法應(yīng)該調(diào)用哪個(gè)子節(jié)點(diǎn)的內(nèi)容,所以輸出結(jié)果是 None:
print(div_tag.string) # None
.strings 和 stripped_strings:
對(duì)于上邊 tag 包含了多個(gè)子節(jié)點(diǎn)的問(wèn)題,可以使用 .strings 來(lái)循環(huán)獲?。?/p>
for str in div_tag.strings: print(str) # PHP Python Golang
.stripped_strings 可以去除多余空白內(nèi)容。
二、父節(jié)點(diǎn)
.parent:
.parent 屬性來(lái)獲取某個(gè)標(biāo)簽或字符串的父節(jié)點(diǎn),比如:
print(title_tag.parent) #bs4 test h1_tag = bs4.h1 print(h1_tag.string.parent) #bs4 test
.parents:
.parents 屬性可以遞歸得到元素的所有父輩節(jié)點(diǎn)。
for p in h1_tag.parents: print(p.name) # body html [document]
三、兄弟節(jié)點(diǎn)
首先先看一下例子中的這一行:
#abc
p_tag = bs4.p print(p_tag.prettify()) ## # a # # # b # # # c # #
都是的子節(jié)點(diǎn),所以這三個(gè)可以被稱為兄弟節(jié)點(diǎn)。
.next_sibling 和 .previous_sibling:
通過(guò)以上兩個(gè)屬性可以查詢兄弟節(jié)點(diǎn)。
print(p_tag.i.next_sibling) # c
print(p_tag.i.previous_sibling) # a
要注意的點(diǎn):
在這里沒(méi)有 previous_sibling 屬性,因?yàn)樗峭?jí)節(jié)點(diǎn)中的第一個(gè)。相反,沒(méi)有 next_sibling 屬性。
字符串“a,b,c”不是兄弟節(jié)點(diǎn),因?yàn)樗鼈兊母腹?jié)點(diǎn)不同。
由于我們上邊的例子是寫的一行,在實(shí)際中 .next_sibling 和 .previous_sibling 屬性通常是字符串或空白。
如果示例是如下方式則 .next_sibling 和 .previous_sibling 獲取到的是空白。
a b c
.next_siblings 和 .previous_siblings:
.next_siblings 和 .previous_siblings 屬性可以對(duì)當(dāng)前節(jié)點(diǎn)的兄弟節(jié)點(diǎn)迭代輸出。
for sibling in p_tag.span.next_siblings:
print(repr(sibling))
#"
"
#b
#"
"
#c
#"
"
for prev in p_tag.em.previous_siblings:
print(repr(prev))
#"
"
#b
#"
"
#a
#"
"
四、回退和前進(jìn)
HTML解析器把文檔字符串轉(zhuǎn)換成一連串的事件:
打開標(biāo)簽 -> 打開標(biāo)簽 -> 打開
Beautiful Soup提供了重現(xiàn)解析器初始化過(guò)程的方法。
.next_element 和 .previous_element:
.next_element 屬性指向解析過(guò)程中下一個(gè)被解析的對(duì)象(字符串或tag)。
print(h1_tag.next_element) # bs4 test
因?yàn)檫@個(gè)結(jié)果是在標(biāo)簽被解析之后的解析內(nèi)容,所以輸出字符串。
print(h1_tag.next_element.previous_element) #bs4 test
h1_tag.next_element 輸出的是“bs4 test”字符串,因?yàn)?.previous_element 指向當(dāng)前被解析的對(duì)象的前一個(gè)解析對(duì)象,所以這里輸出bs4 test
。
.next_elements 和 .previous_elements:
通過(guò) .next_elements 和 .previous_elements 的迭代器可以向前或向后訪問(wèn)文檔的解析內(nèi)容。
str2 = "abc
" bs42 = BeautifulSoup(str2, "lxml") for element in bs42.p.next_elements: print(element) # a # a # b # b # c # c
以上就是本文總結(jié)的使用 Beautiful Soup 對(duì)文檔遍歷的相關(guān)內(nèi)容。
有問(wèn)題歡迎指出。關(guān)注我解鎖更多 Python 干貨哦!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42546.html
摘要:官方解釋如下提供一些簡(jiǎn)單的式的函數(shù)用來(lái)處理導(dǎo)航搜索修改分析樹等功能。廢話不多說(shuō),我們來(lái)試一下吧安裝目前已經(jīng)停止開發(fā),推薦在現(xiàn)在的項(xiàng)目中使用,不過(guò)它已經(jīng)被移植到了,也就是說(shuō)導(dǎo)入時(shí)我們需要。 上一節(jié)我們介紹了正則表達(dá)式,它的內(nèi)容其實(shí)還是蠻多的,如果一個(gè)正則匹配稍有差池,那可能程序就處在永久的循環(huán)之中,而且有的小伙伴們也對(duì)寫正則表達(dá)式的寫法用得不熟練,沒(méi)關(guān)系,我們還有一個(gè)更強(qiáng)大的工具,叫Be...
摘要:前面兩篇介紹的是的基本對(duì)象類型和文檔樹的遍歷本篇介紹的文檔搜索搜索文檔樹主要使用兩個(gè)方法和是用于搜索節(jié)點(diǎn)中所有符合過(guò)濾條件的節(jié)點(diǎn)那么它支持哪些過(guò)濾器呢過(guò)濾器的類型字符串正則表達(dá)式列表方法字符串查找文檔中所有的標(biāo)簽正則表達(dá)式找出所有以開頭的標(biāo) 前面兩篇介紹的是 Beautiful Soup 4 的基本對(duì)象類型和文檔樹的遍歷, 本篇介紹 Beautiful Soup 4 的文檔搜索 搜索文...
摘要:爬取糗百內(nèi)容代碼地址微信公眾號(hào)智能制造社區(qū),歡迎關(guān)注。爬蟲程序一般是通過(guò)模擬瀏覽器對(duì)相應(yīng)發(fā)出請(qǐng)求,獲取數(shù)據(jù),并通過(guò)正則等手段匹配出頁(yè)面中我們所需的數(shù)據(jù)。庫(kù)基本介紹是學(xué)習(xí)爬蟲的一大利器。 爬取糗百內(nèi)容 GitHub 代碼地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py 微信公眾號(hào):【智能制造社區(qū)】,歡迎關(guān)注...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來(lái)源于某博主:htt...
摘要:文檔寫得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代碼中派上用場(chǎng)了。 關(guān)于爬蟲的案例和方法,我們已講過(guò)許多。不過(guò)在以往的文章中,大多是關(guān)注在 如何把網(wǎng)頁(yè)上的內(nèi)容抓取下來(lái) 。今天我們來(lái)分享下,當(dāng)你已經(jīng)把內(nèi)容爬下來(lái)之后, 如何提取出其中你需要的具體信息 。 網(wǎng)頁(yè)被抓取下來(lái),通常就是 str 字符串類型的對(duì)象 ,要從里面尋找信息,最直接的想法就是直接通過(guò)字符串的 find 方法 ...
閱讀 3525·2021-11-25 09:43
閱讀 1282·2021-09-08 09:45
閱讀 2656·2021-09-07 09:59
閱讀 1517·2021-08-09 13:45
閱讀 3370·2019-08-30 15:54
閱讀 707·2019-08-29 18:35
閱讀 524·2019-08-29 17:18
閱讀 1009·2019-08-29 14:10