1. 程式人生 > >Python中的Beautiful Soup模組

Python中的Beautiful Soup模組

一 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']"))

在這裡插入圖片描述