Python中的Beautiful Soup模組
阿新 • • 發佈:2018-12-23
一 Beautiful Soup
1.定義
Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫。它能夠通過你喜歡的轉換器實現慣用的文件導航、查詢、修改文件的方式。
2.Beautiful Soup的使用
用pip install bs4進行安裝
如何使用
將一段文件傳入BeautifulSoup 的構造方法,就能得到一個文件的物件, 可以傳入一段字串或一個檔案控制代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p style="color: #aaffaa" class="class1" id="one">Python最強</p> <p id="one1">Java最強</p> <div>hello</div> </body> </html>
快速使用:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("hello.html"),'html5lib')
print(soup)
soup1 = BeautifulSoup('<b class="boldest">Extremely bold</b>','html5lib')
print(soup1)
3.物件的種類
Beautiful Soup將複雜HTML文件轉換成一個複雜的樹形結構,每個節點都是Python物件,所有物件可以歸納為4種: Tag 、NavigableString 、 BeautifulSoup 、Comment
Tag
NavigableString : 字元內容操作物件
BeautifulSoup: 文件物件
Comment:是一個特殊型別的 NavigableString 物件
4.獲取標籤的內容
from bs4 import BeautifulSoup
#構造物件
soup = BeautifulSoup(open('hello.html'), 'html.parser')
#獲取標籤, 預設獲取找到的第一個符合的內容
print(soup.title)
print(type(soup.title))
print(soup.p)
5.獲取標籤的屬性
print(soup.p.attrs) #獲取標籤指定屬性的內容 print(soup.p['id']) print(soup.p['class']) print(soup.p['style'])
#對屬性進行修改
soup.p['id'] = 'modifyid'
print(soup.p)
print(type(soup.p))
6.獲取標籤的文字內容
print(soup.title.text)
print(soup.title.string)
print(soup.title.name)
print(soup.head.title.string)
7.操縱子節點
一個Tag可能包含多個字串或其它的Tag,這些都是這個Tag的子節點。Beautiful Soup提供了許多操作和遍歷子節點的屬性
print(soup.head.contents)
print(soup.head.children)
for el in soup.head.children:
print(el)
二 面向物件的匹配
#查詢指定的標籤內容
res=soup.p
print(res)
#這樣查詢的結果就是,只會查詢到第一個符合條件的,並不能找到所有符合條件的,這是就要用到 find_all 方法了
res1 = soup.find_all('p')
print(res1)
#與正則表示式的結合使用,首先對於正則表示式進行編譯,這樣可以提高查詢速率
pattern = r'd.+'
pattern = re.compile(pattern)
print(re.findall(pattern, 'this is a dog,only a dog'))
#通過 re 的函式 compile 可以將規則進行編譯,這樣來提高效率將正則與soup相結合
res1 = soup.find_all(re.compile(r'd+'))
print(res1)
#詳細查詢標籤
print(soup.find_all('p', id='one'))
print(soup.find_all('p', id=re.compile(r'one\d{1}')))
print(soup.find_all('p', class_="class1"))
print(soup.find_all('p', class_=re.compile(r'class\d{1}')))
#查詢多個標籤
print(soup.find_all(['p', 'div']))
print(soup.find_all([re.compile('^d'), re.compile('p')]))
#內容的匹配
print(soup.find_all(text='第一章'))
print(soup.find_all(text=re.compile('第一章')))
print(soup.find_all(text=[re.compile('第一章'), 'Title']))
三 CSS的匹配
# 標籤選擇器(div)
res1 = soup.select("p")
print(res1)
# 類選擇器(.class1)
res2 = soup.select(".class1")
print(res2)
# id選擇器(#idname)
res3 = soup.select("#one1")
print(res3)
# 屬性選擇器(p[type="text"]
print(soup.select("p[id='one1']"))
print(soup.select("p['class']"))