內容整理自中國大學MOOC——北京理工大學-蒿天-基於bs4庫的HTML頁面遍歷方法
我們使用如下鏈接作為實驗對象
https://python123.io/ws/demo.html
頁面信息如下
利用requests庫爬取出網頁的HTML完整代碼
1 import requests 2 r = requests.get("http://python123.io/ws/demo.html") 3 demo = r.text 4 print(demo)
網頁內容如下
此處我們可以用prettify()屬性使輸出的HTML內容更整齊
print(soup.prettify())
【prettify()屬性也可用於按格式輸出指定標簽下的相關內容】
熟悉HTML頁面架構的都知道,HTML頁面中有兩大類標簽,<head>和<body>,這兩類標簽在當前HTML信息中都有展現。
然后我們就可以根據HTML的格式架構,產生三種遍歷HTML標簽的方法:從HTML根標簽向子標簽的向下遍歷,從子標簽向根標簽的向上遍歷,同級標簽間的平行遍歷。
1.下行遍歷
1 import requests 2 from bs4 import BeautifulSoup 3 r = requests.get("http://python123.io/ws/demo.html") 4 demo = r.text 5 soup = BeautifulSoup(demo,"html.parser") 6 print(soup.head) #獲取HTML網頁的head標簽部分
首先我們獲取HTML中head部分的信息
然后我們利用contents屬性,取當前head中所有子標簽的信息
print(soup.head.contents)
內容如下
當前head標簽中僅有一組<title></title>標簽,<title>標簽內容被放入列表中
contents會將當前部分的所有標簽存入列表(返回結果為一個列表形式)
同理,<body>標簽中的全部內容也可用contents進行獲取
print(soup.body.contents)
應該注意到,不是只有被標簽標記的內容才被視為子標簽信息,像當前<body>中的'\n'等內容同樣被視為子標簽節點。
驗證統計的當前<body>標簽內子標簽節點的個數
print(len(soup.body.contents))
結果為5
(通過觀察也不難發現,body.contents這個list中,list(0),list(2),list(4)均為換行符,list(1),list(3)分別為一個<p>)
讀取body.contents列表中第2個元素也不難
print(soup.body.contents[1])
用.children屬性迭代遍歷<body>標簽下的各子節點
for child in soup.body.children: print(child)
2.上行遍歷
利用.parent屬性遍歷節點的父親標簽
利用.parents屬性遍歷節點的所有先輩標簽,返回迭代類型
print(soup.title.parent)
<title>的父輩節點是<head>標簽
print(soup.html.parent)
<html>作為一級標簽,它的父輩節點就是它本身
而soup的父輩節點為空
一次性完成當前頁面上行遍歷
1 import requests 2 from bs4 import BeautifulSoup 3 r = requests.get("http://python123.io/ws/demo.html") 4 demo = r.text 5 soup = BeautifulSoup(demo,"html.parser") 6 for parent in soup.a.parents: 7 if parent is None: 8 print(parent) 9 else: 10 print(parent.name)
3.平行遍歷
.next_sibling 返回按照HTML文本順序的下一個平行節點
.previous_sibling 返回按照HTML文本順序的上一個平行節點
.next_siblings 迭代返回HTML文本順序的后續所有平行節點
.previous_siblings 迭代返回返回HTML文本順序的先前所有平行節點
所有平行遍歷必須發生自同一個父節點下
比如<head>與<body>下的不同標簽不能通過平行節點進行跨越遍歷
單次遍歷
print(soup.a.next_sibling)
平行遍歷獲得的下一個節點未必一定是標簽類型
迭代遍歷
for siblilng in soup.a.next_siblings: print(siblilng)