靈活又方便的網(wǎng)頁解析庫,處理高效,支持多種解析器。利用它不用編寫正則表達(dá)式即可方便地實現(xiàn)網(wǎng)頁信息的提取。
1 安裝:
pip3 install beautifulsoup4
2 使用:
2.1 解析庫:
| 解析器 | 優(yōu)勢 | 劣勢 |
|---|---|---|
| python標(biāo)準(zhǔn)庫 (html.parse) | python內(nèi)置標(biāo)準(zhǔn)庫 執(zhí)行速度適中文檔容錯能力強(qiáng) |
與之前版本中文容錯能力差 |
| lxml html解析器 | 速度快,文檔容錯能力強(qiáng) | 需要安裝C語言庫? |
| lxml XML解析器 | 速度快,唯一支持XML的解析器 | 需要安裝C語言 |
| html5lib | 最好的容錯性,以瀏覽器的放式解析文檔生成html5格式的文檔 | 速度慢 |
2.2:標(biāo)簽選擇器:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html.'xml')
- soup.prettify()
格式化代碼,補(bǔ)全,容錯處理- soup.title.string()
選中title打印里面的內(nèi)容
- print(soup.title)
- pirnt(type(soup.title))
- print(soup.head)
- print(soup.p)
連同標(biāo)簽一起打印,只打印第一個結(jié)果
獲取名稱:
- print(soup.title.name)
title
獲取屬性:
- print(soup.p.attrs['name'])
- print(soup.p['name']
獲取內(nèi)容:
- print(soup.p.string)
嵌套選擇:
- print(soup.head.title.string)
子節(jié)點和子孫節(jié)點:
- print(soup.p.contents)
獲取子節(jié)點返回類型為列表
獲取子節(jié)點
for i, child in enumerate(soup.p.children):
print(i, child)
#返回類型為迭代器
獲取子孫節(jié)點
for i, child enumerate(soup.p.descendants):
print(i,child)
#返回類型為迭代器
父節(jié)點和祖先節(jié)點:
- print(soup.a.parent)
獲取父節(jié)點- print(list(enumerate(soup.a.parents)))
枚舉,并轉(zhuǎn)化成列表
獲取所有祖先節(jié)點
獲取兄弟節(jié)點:
- print(list(enumerate(soup.a.next_siblings)))
獲取后面的兄弟節(jié)點- print(list(enumerate(soup.a.previous_siblings)))
獲取之前的兄弟節(jié)點
2.3 標(biāo)準(zhǔn)選擇器:
find_all(name,attrs,recursive,text,**kwargs)
- print(soup.find_all('ul'))
- print(soup.find_all(attrs={'name',elements'}))
特殊類型:
- print(soup.find_all(id='list-1'))
- print(soup.find_all(class_='element'))
text:
- print(soup.find_all(text='Foo'))
find(name,attrs,recursive,text,**kwargs)
find返回單個元素,find_all返回所有元素
find_parents()
find_parent()
find_parents()返回所有祖先節(jié)點,find_parent()返回直接父節(jié)點
find_next_siblings()
find_next_sibling()
find_next_siblings()返回后面所有兄弟節(jié)點
find_next_sibling()返回后面第一個兄弟節(jié)點
find_previous_sblings()
find_previous_sibling()
find_previous_sblings()返回前面所有兄弟節(jié)點
find_previous_sibling()返回前面第一個兄弟節(jié)點
find_all_next()
find_next()
find_all_next()返回節(jié)點后所有符合條件的節(jié)點,
find_next()返回節(jié)點后第一個符合條件的節(jié)點
find_all_previous()
find_previous()
find_all_previous()返回節(jié)點前所有符合條件的節(jié)點,
find_previsous(()返回第一個符合條件的節(jié)點
2.4 CSS選擇器:
通過select()直接傳入CSS選擇器即可
print(soup.select('.pane .pane-heading')) # .代表class屬性
print(soup.select('ul i'))
print(soup.select('#list-2 .element')) # #代表id
#獲取屬性
for ul in soup.select('ul'):
print(ul['id']) #獲取屬性
print(ul.attrs['id'] #獲取屬性
#獲取內(nèi)容
for ul in soup.select('li')
print(ul.get_text())