Beautiful Soup實踐

寫在前面:

Beautiful Soup是一個可以從HTML或XML文件中提取數據的Python庫.它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.。

一、安裝和導入:

1、命令行下通過pip安裝:

$ pip install bs4n

2、安裝解析器:

Beautiful Soup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,其中一個是 lxml。

二、快速入門:

使用Beautiful Soup示例:

import bs4nfrom bs4 import BeautifulSoupnimport lxmlnnhtml_doc = """n<html><head><title>The Dormouses story</title></head>n<body>n<p class="title"><b>The Dormouses story</b></p>nn<p class="story">Once upon a time there were three little sisters; and their names weren<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,n<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> andn<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;nand they lived at the bottom of a well.</p>nn<p class="story">...</p>n"""n

按照標準的縮進格式的結構輸出:

soup=BeautifulSoup(html_doc,"lxml")nprint(soup.prettify())n

顯示結果如下:

幾個簡單的瀏覽結構化數據的方法:

soup.titlen# <title>The Dormouses story</title>nnsoup.title.namen# utitlennsoup.title.stringn# uThe Dormouses storynnsoup.title.parent.namen# uheadnnsoup.pn# <p class="title"><b>The Dormouses story</b></p>nnsoup.p[class]n# utitlennsoup.an# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>nnsoup.find_all(a)n# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,n# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,n# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]nnsoup.find(id="link3")n# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>n

從文檔中找到所有<a>標籤的鏈接:

for link in soup.find_all(a):n print(link.get(href))n

顯示結果如下:

從文檔中獲取所有文字內容:

print(soup.get_text())n

顯示結果如下:

三、對象的種類:

1、Tag:

Tag 對象與XML或HTML原生文檔中的tag相同,它有兩個最重要的屬性: name和attributes。

2、NavigableString:

3、BeautifulSoup:

4、Comment:

四、遍歷文檔樹

1、子節點:

(1)如果tag中包含多個字元串 ,可以使用 .strings 來循環獲取:

soup=BeautifulSoup(html_doc,"lxml")nfor string in soup.strings:n print(repr(string))n

顯示結果如下:

(2)輸出的字元串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多餘空白內容:

soup=BeautifulSoup(html_doc,"lxml")nfor string in soup.stripped_strings:n print(repr(string))n

顯示結果如下:

2、父節點:

3、兄弟節點:

五、搜索文檔樹

find() 和 find_all() 是BeautifulSoup的兩個重要搜索方法。

1、find_all():

(1)find_all() 方法搜索當前tag的所有tag子節點,並判斷是否符合過濾器的條件,語法如下:

find_all( name , attrs , recursive , text , **kwargs )n

示例如下:

print(soup.find_all([title,a])) #如果傳入列表參數,Beautiful Soup會將與列表中任一元素匹配的內容返回n

顯示結果如下:

(2)按照CSS類名搜索tag的功能非常實用:

print(soup.find_all(a,class_=sister))n

顯示結果如下:

2、find():

(1)語法如下:

find( name , attrs , recursive , text , **kwargs )n

(2)css選擇器:

  • 在 Tag 或 BeautifulSoup 對象的 .select() 方法中傳入字元串參數,即可使用CSS選擇器的語法找到tag:

print(soup.select(title))n

顯示結果如下:

  • 通過tag標籤逐層查找:

print(soup.select(body a))n

顯示結果如下:

  • 找到某個tag標籤下的直接子標籤:

print(soup.select(p > #link1))n

顯示結果如下:

  • 通過CSS的類名查找:

print(soup.select(.sister))n

顯示結果如下:

  • 通過tag的id查找:

print(soup.select(#link2))n

顯示結果如下:

  • 通過是否存在某個屬性來查找:

print(soup.select(a[href]))n

顯示結果如下:

六、修改文檔樹

七、輸出

1、格式化輸出:

prettify() 方法將Beautiful Soup的文檔樹格式化後以Unicode編碼輸出,每個XML/HTML標籤都獨佔一行:

print(soup.prettify())n

顯示結果如下:

2、壓縮輸出(沒太理解?):

3、get_text():

如果只想得到tag中包含的文本內容,那麼可以用 get_text() 方法,這個方法獲取到tag中包含的所有文版內容包括子孫tag中的內容,並將結果作為Unicode字元串返回:

print(soup.get_text)n

顯示結果如下:

4、輸出編碼:

通過Beautiful Soup輸出文檔時,不管輸入文檔是什麼編碼方式,輸出編碼均為UTF-8編碼

八、解析部分文檔

如果僅僅因為想要查找文檔中的<a>標籤而將整片文檔進行解析,實在是浪費內存和時間.最快的方法是從一開始就把<a>標籤以外的東西都忽略掉. SoupStrainer 類可以定義文檔的某段內容,這樣搜索文檔時就不必先解析整篇文檔,只會解析在 SoupStrainer 中定義過的文檔。

from bs4 import SoupStrainernonly_a_tags=SoupStrainer(a)nprint(BeautifulSoup(html_doc,"lxml",parse_only=only_a_tags).prettify())n

顯示結果如下:

參考資料:

1、Beautiful Soup 4.2.0 文檔

推薦閱讀:

[11] Python條件判斷語句(二)
20170402Python變數類型 知識點梳理
[21] Python函數(二)

TAG:Python | beautifulsoup |