bs4即Beautiful Soup 4是另一個用來解析HTML或XML文件的Python庫,不得不說Beautiful Soup這個名字取的非常合適:“美味的湯” ---- 作為湯類菜飞醉,有時(shí)候是可有可無的没咙,就像如果沒有bs4我們使用css或者xpath選擇器也能做到文檔解析缭嫡;但是如果桌上有湯蜡塌,不管是飯后喝一碗還是用來泡飯吃,都極為增色,就像bs4,它所提供的各種方法讓你在解析網(wǎng)頁的時(shí)候無所不利舒裤,將會大大的減少你的時(shí)間笤成。
Rule No.1
如果你是第一次使用bs4待德,在寫體驗(yàn)代碼的時(shí)候不要把你的測試文件命名為bs4.py狈惫,這會引起一些問題。會引起什么問題夭坪?在導(dǎo)入BeautifulSoup的時(shí)候文判,from bs4 import BeautifulSoup
Python會優(yōu)先從你這個文件里導(dǎo)入。
我的筆記
bs4的官方中文文檔是:Beautiful Soup 4.2.0 文檔, 其英文文檔是4.4版本的室梅。我把4.2的中文文檔看了一遍戏仓,以下是我的筆記。
解析器
HTML解析器是Python的官方解釋器亡鼠,同時(shí)還有一個很推薦的第三方解析器叫l(wèi)xml柜去。解析器就是用來解析HTML文檔的,在你指定解析那個網(wǎng)頁內(nèi)容時(shí)拆宛,你同樣需要指定一個解析器嗓奢,這樣網(wǎng)頁就會被解析成某種格式供你之后進(jìn)行操作。你可以使用如下代碼來查看文檔被解析成了什么樣子:
from bs4.diagnose import diagnose
data = open("bad.html").read()
diagnose(data)
幾種解析器的比較(我:需要C語言庫盡然也可以是劣勢):
解析器 | 使用方法 | 優(yōu)勢 | 劣勢 |
---|---|---|---|
Python標(biāo)準(zhǔn)庫 | BeautifulSoup(markup, "html.parser") |
Python的內(nèi)置標(biāo)準(zhǔn)庫執(zhí)行速度適中文檔容錯能力強(qiáng) | Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
速度快文檔容錯能力強(qiáng) | 需要安裝C語言庫 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml", "xml"])``BeautifulSoup(markup, "xml") |
速度快唯一支持XML的解析器 | 需要安裝C語言庫 |
html5lib | BeautifulSoup(markup, "html5lib") |
最好的容錯性以瀏覽器的方式解析文檔生成HTML5格式的文檔 | 速度慢不依賴外部擴(kuò)展 |
一個樹形結(jié)構(gòu)
這個其實(shí)就是官方文檔目錄的一個簡化版浑厚,其實(shí)我想說的都在官方文檔里寫的很詳細(xì)了股耽,作為一篇介紹bs4的文檔我實(shí)在不知道在寫些什么了。聊以湊數(shù)吧钳幅。
- 對象
- tag (可以對文檔進(jìn)行修改)
- attributes
- 可以用
unicode()
轉(zhuǎn)換成Python字符串物蝙,一者便于操作,二者節(jié)省內(nèi)存 - 特殊字符串敢艰,如注釋
- 遍歷文檔樹
- 子節(jié)點(diǎn)
- tag的名字诬乞,find(), find_all()方法
- .content和.children,這兩項(xiàng)和find系列方法有異曲同工之妙。
- .descendants
- .string, .strings和.stripped_strings
- 父節(jié)點(diǎn)
- .parent和.parents
- 兄弟節(jié)點(diǎn)
- .next_sibling 和.previous_sibling
- .next_siblings 和.previous_siblings
- 回退和前進(jìn)
- .next_element和.previous_element
- .next_elements和.previous_elements
- 回退前進(jìn)和兄弟節(jié)點(diǎn)幾個方法的輸出有時(shí)候是一樣的
- 子節(jié)點(diǎn)
- 搜索文檔樹
- 過濾器
- 字符串過濾
- 正則表達(dá)式
- 列表
- True
- 方法
- find_all()
- find_all( name , attrs , recursive , text , **kwargs )
- name參數(shù)和keyword參數(shù)
- 按CSS搜索震嫉,使用關(guān)鍵詞
class_
- text參數(shù)
- limit參數(shù)
- recursive參數(shù)
- find系列方法
- find_all(), find()其中后者返回前者的第一項(xiàng)森瘪,其余用法一樣
- find_parents() 和 find_parent()
- find_next_siblings() 和find_next_sibling()
- find_previous_siblings() 和 find_previous_sibling()
- find_all_next() 和 find_next()
- find_all_previous() 和 find_previous()
- CSS選擇器
soup.select("body a")
- 直接子標(biāo)簽
- 兄弟節(jié)點(diǎn)標(biāo)簽
- CSS類名
- 通過id查判斷是否存在某個屬性
- 通過屬性的值
- 通過語言設(shè)置
- 修改文檔樹
- tag
- 修改.string
- append()
- new_string() 和 .new_tag()
- insert()
- insert_before() 和 insert_after()
- clear()
- extract()
- decompose()
- replace_with()
- wrap()
- unwrap()
- 過濾器
- 輸出
- 格式化輸出
- 壓縮輸出
- get_text()
- 解析部分文檔:SoupStrainer