從BeautifulSoup說起
BeautifulSoup是解析、遍歷、維護“標簽樹”的功能庫
一、html基礎
1. HTML 標題(Heading)是通過<h1> - <h6> 標簽來定義的.
舉個栗子:<h1>這是一個標題</h1> <h2>這是一個標題</h2> <h3>這是一個標題</h3>
2. HTML 段落是通過標簽 <p> 來定義的.
舉個栗子:<p>這是一個段落。</p> <p>這是另外一個段落。</p>
3. HTML 鏈接 HTML 鏈接是通過標簽 <a> 來定義的.
舉個栗子:<a href="http://www.runoob.com">這是一個鏈接</a>
在 href 屬性中指定鏈接的地址。4. HTML 圖像是通過標簽 <img> 來定義的.
舉個栗子:<img src="/images/logo.png" width="258" height="39" />註意: 圖像的名稱和尺寸是以屬性的形式提供的。
5. <body>定義了一個主 體
一般而言,html的結構為:
<html> 標簽樹 <body> <p class = "title">....</p> <body> </html>
示意圖如下
二、正式說beutifulSoup庫
1. 一般導入用 from bs4 import BeautifulSoup
2. BeautifulSoup類的五個基本元素(每個部分即對應html的一個部分)
3. tag的方法:soup.<tag>訪問獲得HTML中的標簽,當HTML文檔中存在多個相同的<tag>對應的內容時,soup.<tag>返回第一個
下面以這段html源碼為例子:
1 <html><head><title>This is a python demo page</ title></head>
2 <body>
3 <p class="title"><b>The demo python introduces several python courses.</b></p>
4 <p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
5 <a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p>
6 </body></html>
python代碼,導入模塊
import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/demo.html")
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
taga = soup.a ###即a標簽的內容
3.1 <tag>.name 標簽的名字,得到的為字符串類型,<p>...</p>的名字為p
eg.
soup.a.name
>>‘a‘
3.2 <tag>.attrs 標簽的屬性,字典形式的組織
taga = soup.a
taga.attrs ##由此可見一個標簽可以有多個屬性
>>{‘id‘ : ‘link1‘, ‘class‘ : [‘py1‘], ‘href‘ : ‘http://.....‘}
taga.attrs[id] #標簽的屬性為字典類型,從而屬性是成對出現
>>link1
3.3 <tag>.string 標簽內非屬性字符串(NavigableString),他有時可以跨越多個層次, 結果是<>....</>中的字符串,尖括號內的內容可能是單單一個標簽名,也可能是加了一大堆屬性
eg.
3.4 tag的comment,標簽內字符串的註釋部分,一種特殊的comment類
總結起來就是最後這幅圖,而且後三種元素都相當與在tag之下才能使用,分別可以用到標簽名,屬性,NavigableString,commen
三、標簽樹遍歷方法
1 標簽樹的下行遍歷
1.1 下行遍歷主要是三種方法:<tag>.contents、children、descendants
<tag>.contents 子節點的列表,將<tag>所有子節點存入列表
.children子節點的叠代類型,與.contents類似,用於循環遍歷子節點
.desendants子孫節點的叠代類型,包含所有子孫節點,用於循環遍歷
下行遍歷的兩個方法
1.2 (1)遍歷子節點
for child in soup.body.contents
print(child)
(2)遍歷孫節點
for child in soup.body.descendants:
print(child)
2 標簽樹的上行遍歷
2.1 上行遍歷的兩個方法:<tag>.parent,<tag>.parents
.parent 節點的父親標簽
parents節點先輩標簽的叠代類型,用於循環遍歷先輩節點
2.2 上行遍歷的例子
soup=BeautifulSoup(demo,"html.parser")
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
此方法會遍歷先輩節點,包括soup本身,所以要區別判斷
3. 標簽樹的平行遍歷(平行的前提是在同一個父節點下邊)
3.1 標簽樹平行遍歷的屬性
.next_sibling 返回按照HTML文本順序的下一個平行節點標簽
.previous_sibling返回按照HTML文本順序的上一個平行節點標簽
.next_siblings叠代類型,返回按照HTML文本順序的後續所有平行節點標簽
.previous_siblings叠代類型,返回按照HTML文本順序的前續所有平行節點標簽
3.2 平行遍歷的兩種方法
遍歷前序節點
for ping in soup.a.previous_sibling:
print(ping)
for ping in soup.a.next_sibling:#遍歷後續節點
print(ping)
四、BeautifulSoup庫的四種解析器
從BeautifulSoup說起