Beautiful Soup 將復雜 HTML 文檔轉換成一個復雜的樹形結構,每個節點都是 Python 對象,所有對象可以歸納為 4 種: Tag、NavigableString、BeautifulSoup、Comment,Attribute 。
Tag
通俗點講就是 HTML 中的一個個標簽。
NavigableString
:獲取標簽內部的文字,如,soup.p.string
。
BeautifulSoup
:表示一個文檔的全部內容。大部分時候,可以把它當作 Tag 對象,是一個特殊的 Tag。
Comment:Comment
對象是一個特殊類型的 NavigableString
對象,其輸出的內容不包括注釋符號,但是如果不好好處理它,可能會對我們的文本處理造成意想不到的麻煩。
裝載BeautifulSoup
from bs4 import BeautifulSoup import requests url = 'http://python123.io/ws/demo.html' r = requests.get(url) demo = r.text # 服務器返回響應 soup = BeautifulSoup(demo, "html.parser") """ demo 表示被解析的html格式的內容 html.parser表示解析用的解析器 """ print(soup) # 輸出響應的html對象
輸出結果
print(soup.title) # 獲取html的title標簽的信息 print(soup.a) # 獲取html的a標簽的信息(soup.a默認獲取第一個a標簽,想獲取全部就用for循環去遍歷) print(soup.a.name) # 獲取a標簽的名字 print(soup.a.parent.name) # a標簽的父標簽(上一級標簽)的名字 print(soup.a.parent.parent.name) # a標簽的父標簽的父標簽的名字
輸出結果
<title>This is a python demo page</title>
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
a
p
body
print('a標簽類型是:', type(soup.a)) # 查看a標簽的類型 print('第一個a標簽的屬性是:', soup.a.attrs) # 獲取a標簽的所有屬性(注意到格式是字典) print('a標簽屬性的類型是:', type(soup.a.attrs)) # 查看a標簽屬性的類型 print('a標簽的class屬性是:', soup.a.attrs['class']) # 因為是字典,通過字典的方式獲取a標簽的class屬性 print('a標簽的href屬性是:', soup.a.attrs['href']) # 同樣,通過字典的方式獲取a標簽的href屬性
輸出結果
a標簽類型是: <class 'bs4.element.Tag'>
第一個a標簽的屬性是: {'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
a標簽屬性的類型是: <class 'dict'>
a標簽的class屬性是: ['py1']
a標簽的href屬性是: http://www.icourse163.org/course/BIT-268001
BeautifulSoup的提供了兩個超級好用的方法(可能是你用bs方法中最常用的)。借助這兩個函數,你可以通過表現的不同屬性輕松過濾HTML(XML)文件,查找需要的標簽組或單個標簽。
find()找到第一個滿足條件的標簽就返回,不在繼續往下尋找。
findAll()找到所有滿足條件的標簽以列表形返回。
print(soup.find('a'))#找尋a標簽第一次出現的位置
結果
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
常用通過find_all()方法來查找標簽元素:<>.find_all(name, attrs, recursive, string, **kwargs) ,返回一個列表類型,存儲查找的結果
• name:對標簽名稱的檢索字符串
• attrs:對標簽屬性值的檢索字符串,可標注屬性檢索
• recursive:是否對子孫全部檢索,默認True
• string:<>…</>中字符串區域的檢索字符串
for i in soup.find_all('a'):
print('標簽名稱:', i)
結果為
標簽名稱: <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a> 標簽名稱: <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>
for i in soup.find_all('a',{'class':{'py1'}}): #找尋a標簽當中class為py1的html標簽
print(i)
結果為
標簽名稱: <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>