Python爬蟲——利用bs4庫對HTML頁面信息進行遍歷讀取


內容整理自中國大學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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM