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