BeautifulSoup4 提取數據爬蟲用法詳解


Beautiful Soup 是一個HTML/XML 的解析器,主要用於解析和提取 HTML/XML 數據。 
它基於 HTML DOM 的,會載入整個文檔,解析整個 DOM樹,因此時間和內存開銷都會
大很多,所以性能要低於lxml。 BeautifulSoup 用來解析 HTML 比較簡單,API非常人性化,支持CSS選擇器、Python
標准庫中的HTML解析器,也支持 lxml 的 XML解析器。雖然說BeautifulSoup4 簡單容易比較上手,但是匹配效率還是遠遠不如正則以及xpath的,一般不推薦使用,推薦正則的使用。

第一步:pip install beautifulsoup4 ,萬事開頭難,先安裝 beautifulsoup4,安裝成功后就完成了第一步。

第二步:導入from bs4 import BeautifulSoup 這個模塊

第三步:創建 Beautiful Soup 對象          soup = BeautifulSoup(html) 

開始使用:

 Beautiful Soup將復雜HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對
象,所有對象可以歸納為 4種: (1)Tag (2) NavigableString (3) BeautifulSoup (4) Comment 

(1)用BeautifulSoup來獲取Tags :Tag 通俗點講就是 HTML 中的一個個標簽,直接用BeautifulSoup來調用

soup = BeautifulSoup(html,’lxml’)
print(soup.title)
print(soup.head)
print(soup.a)
print(soup.p)
print(type(soup.p))
這樣就可以得到你想要的標簽內容了。

tag還可以進行增刪改查的操作:

#soup 對象本身比較特殊,它的 name 即為 [document]
print(soup.name)
print(soup.head.name)
#把 p 標簽的所有屬性打印輸出了出來,得到的類型是一個字典。
print(soup.p.attrs)
#根據名稱獲取對應的屬性值,類型為列表
print(soup.p['class'])
print(soup.p.get('class'))
# 可以對這些屬性和內容等等進行修改
soup.p['class'] = "newClass"
print(soup.p)
# 刪除屬性
del soup.p['class']
print(soup.p)
(2)  NavigableString 

獲取標簽內部的文字用 .string 即可

print(soup.p.string)
# The Dormouse's story

print(type(soup.p.string))
# In [13]: <class 'bs4.element.NavigableString'
(3)   BeautifulSoup

BeautifulSoup 對象表示的是一個文檔的內容。大部分時候,可以把它當作 Tag對象,是
一個特殊的 Tag,我們可以分別獲取它的類型,名稱,以及屬性

print(type(soup.name))
# <type 'unicode'>
print(soup.name)
# [document]
print(soup.attrs)
# 文檔本身的屬性為空 # {}
(4) Comment

Comment對象是一個特殊類型的NavigableString 對象,其輸出注釋但不包含注釋符號。 

print(soup.a)
# <a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>

print(soup.a.string)
# Elsie


print(type(soup.a.string))
# <class 'bs4.element.Comment'>
a 標簽里的內容實際上是注釋,但是如果我們利用 .string 來輸出它的內容時,注釋符號已經去掉了 

一      開始搜索文檔樹:.find_all(name, attrs, recursive, text, **kwargs) 

1)name 參數 
name 參數可以查找所有名字為 name 的 tag,字符串對象會被自動忽略掉 
A.傳字符串 
Beautiful Soup會查找與字符串完整匹配的內容 
范例:用於查找文檔中所有的<b>標簽: 
print(soup.find_all('b')) print(soup.find_all('a')) 
B.傳正則表達式 
Beautiful Soup會通過正則表達式的 match()來匹配內容. 
范例:找出所有以 b開頭的標簽,這表示<body>和<b>標簽都應該被找到 
import re for tag in soup.find_all(re.compile("^b")):     print(tag.name) 
C.傳列表 
Beautiful Soup會將與列表中任一元素匹配的內容返回. 
范例:找到文檔中所有<a>標簽和<b>標簽: 
print(soup.find_all(["a", "b"])) 
2)keyword 參數 
print(soup.find_all(id='link2')) 
3)text 參數 
text 參數接受字符串,正則表達式,列表, 可以搜搜文檔中的字符串內容 
print(soup.find_all(text="Elsie")) 
print(soup.find_all(text=["Tillie", "Elsie", "Lacie"])) 
print(soup.find_all(text=re.compile("Dormouse"))) 

 

二 CSS選擇器      (重點!!!!!!)

寫 CSS時,標簽名不加任何修飾,類名前加.,id名前加# 
可以利用類似的 soup.select()方法來篩選元素,返回結果是 list 
soup.select_one() 返回值是list的首個。 
(1)通過標簽名查找 
print(soup.select('title'))  print(soup.select('a')) print(soup.select('b')) 
(2)通過類名查找 
print(soup.select('.sister')) 
(3)通過 id 名查找 
print(soup.select('#link1')) 
(4)組合查找 
組合查找即和寫 class文件時,標簽名與類名、id名進行的組合原理是一樣的,例如查找 
p 標簽中,id 等於 link1的內容,二者需要用空格分開 
print(soup.select('p #link1')) 直接子標簽查找,則使用 > 分隔 
print(soup.select("head > title")) 
(5)屬性查找 
查找時還可以加入屬性元素,屬性需要用中括號括起來,注意屬性和標簽屬於同一節點,
所以中間不能加空格,否則會無法匹配到。 
print(soup.select('a[class="sister"]')) 
print(soup.select('a[href="http://example.com/elsie"]')) 
同樣,屬性仍然可以與上述查找方式組合,不在同一節點的空格隔開,同一節點的不加
空格 
print(soup.select('p a[href="http://example.com/elsie"]')) 
(6)獲取內容 
可以遍歷 select 方法返回的結果,然后用 get_text() 方法來獲取它的內容。 
soup = BeautifulSoup(html, 'lxml') 
print(type(soup.select('title'))) 
print(soup.select('title')[0].get_text()) 
for title in soup.select('title'):     
print(title.get_text()) 

 

學會以上這些,基本就可以自己掌握BeautifulSoup4的使用了
————————————————
版權聲明:本文為CSDN博主「趕在日落之前」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lzz781699880/article/details/81209038


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM