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 |