CSS 選擇器:BeautifulSoup4
from: Mp
ps: 下文的使用方法只列出了常用的店茶,詳細(xì)請(qǐng)看官方文檔
概念
Beautiful Soup基于HTMLDOM,會(huì)載入整個(gè)文檔弹囚,解析整個(gè)DOM樹(shù)
官方文檔:
使用
創(chuàng)建bs對(duì)象
# 打開(kāi)本地HTML文件的方式來(lái)創(chuàng)建對(duì)象
soup = BeautifulSoup(open('xxxx.html'))
# 創(chuàng)建Beautiful Soup對(duì)象
soup = BeautifulSoup(html, "lxml") # 指定lxml解析器
格式化輸出soup對(duì)象內(nèi)容
print(soup.prettify())
Tag 類
# 獲取Tag soup.標(biāo)簽名 查找的是在所有內(nèi)容中的第一個(gè)符合要求的標(biāo)簽
print(soup.標(biāo)簽名)
# name是獲取當(dāng)前標(biāo)簽名稱,soup.name為[document]
print(soup.標(biāo)簽名.name)
# attrs獲取當(dāng)前標(biāo)簽的所有屬性和值灰瞻,以鍵值對(duì)形式存入字典返回 下文以 a 標(biāo)簽為例
print(soup.a.attrs)
# 獲取標(biāo)簽?zāi)骋粚傩缘闹?print(soup.a['href'])
# 修改標(biāo)簽?zāi)骋粋€(gè)屬性的值
soup.a['href'] = "http://www.peipeipei.com"
# 刪除某一屬性
del soup.a['class']
NavigableString 類 以p標(biāo)簽為例
# 獲取標(biāo)簽內(nèi)內(nèi)容
print(soup.p.string)
print(type(soup.p.string))
Comment類 以a標(biāo)簽為例饼暑,a標(biāo)簽內(nèi)內(nèi)容為注釋
<a class="sister" id="link1"><!-- Elsie --></a>,
print(soup.a.string) # 注釋符號(hào)不輸出,只輸出內(nèi)容
# Elsie
print(type(soup.a.string))
# <class 'bs4.element.Comment'>
遍歷文檔樹(shù) 以head標(biāo)簽為例
"<head><title>The Dormouse's story</title></head>"
# .content 屬性可以將tag的子節(jié)點(diǎn)以列表的方式輸出
print(soup.head.contents)
# [<title>The Dormouse's story</title>]
print(soup.head.contents[1]) # 獲取列表中某一元素
# .children 返回的是一個(gè)list生成器對(duì)象
print(soup.head.children)
# <listiterator object at 0x7f71457f5710>
for child in soup.body.children:
print(child)
# .descendants 對(duì)所有tag的子孫節(jié)點(diǎn)進(jìn)行遞歸循環(huán)
for child in soup.descendants:
print(child)
# .string 返回最里面的內(nèi)容
print(soup.head.string)
print(soup.title.string) # 兩個(gè)輸出是一樣的
搜索文檔樹(shù)
find_all(name, attrs, recursive, text, **kwargs)
# find用法相同狡忙,只返回一個(gè)
# name參數(shù)可以查找所有名字為 name 的tag梳虽,可以是字符串,正則表達(dá)式灾茁,列表
print(soup.find_all('a'))
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
print(soup.find_all(["a", "b"]))
# keyword參數(shù)直接匹配屬性對(duì)應(yīng)的值
print(soup.find_all(class_="sister")) # 因?yàn)閏lass在python中已經(jīng)有了窜觉,為了防止沖突,所以是class_
print(soup.find_all(id='link2'))
# text參數(shù)搜索文檔中的字符串內(nèi)容北专,與name參數(shù)的可選值一樣,text參數(shù)接受字符串,正則表達(dá)式,列表
print(soup.find_all(text="Elsie"))
print(soup.find_all(text=["Tillie", "Elsie", "Lacie"]))
print(soup.find_all(text=re.compile("Dormouse")))