python httpstr find_Python爬虫 | BeautifulSoup使用
BeautifulSoup介紹
與lxml一樣,BeautifulSoup也是一個HTML/XML的解析器,主要功能也是如何解析和提取HTML/XML數據。
幾種解析工具的對比
工具
速度
難度
正則表達式
最快
困難
BeautifulSoup
慢
最簡單
lxml
快
簡單
lxml 只會局部遍歷,而Beautiful Soup 是基于HTML DOM的,會載入整個文檔,解析整個DOM樹,因此時間和內存開銷都會大很多,所以性能要低于lxml。
安裝
我的環境是Python 3.6.5,windows下cmd里執行pip安裝即可。
pip3 install beautifulsoup4
測試
python終端里導入beautifulsoup,無報錯信息即安裝成功。
>>from bs4 import BeautifulSoup
>>
BeautifulSoup對象
BeautifulSoup將復雜的HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對象,所有對象可以歸納為4種:
Tag
NavigableString
BeautifulSoup
Comment
BeautifulSoup 對象表示的是一個文檔的內容。大部分時候,可以把它當作 Tag 對象,是一個特殊的 Tag。
Comment 對象是一個特殊類型的 NavigableString 對象,其輸出的內容不包括注釋符號。
Tag
Tag可以簡單理解為HTML文檔中的一個個的標簽,比如:
The Dormouse's storyfirst item
上面HTML文檔中的head、title、ur、li都是HTML標簽(節點名稱),這些標簽加上里面的內容就是tag。
獲取Tags
# 導入模塊
from bs4 import BeautifulSoup
html = """
The Dormouse's storyThe Dormouse's story
Once upon a time there were three little sisters; and their names were
,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
# 初始化BeautifulSoup對象,指定lxml解析器
soup = BeautifulSoup(html, 'lxml')
# prettify()方法格式化soup的內容
print(soup.prettify())
# soup.title選出title節點
print(soup.title)
#
The Dormouse's storyprint(type(soup.title))
#
print(soup.head)
#
The Dormouse's storyprint(soup.p)
#
The Dormouse's story
說明:使用soup加節點名稱可以獲取節點內容,這些對象的類型是bs4.element.Tag,但是它查找的是在內容中第一個符合要求的節點。比如上面代碼有多個p標簽,但是它只查找了第一個p標簽。
對于Tag有兩個重要的屬性,name和attrs。當選擇一個節點后,name屬性獲取節點的名稱,attrs屬性獲取節點的屬性(以字典形式返回)。
print(soup.name)
# [document] #soup 對象本身比較特殊,它的 name 即為 [document]
print(soup.head.name)
# head #對于其他內部標簽,輸出的值便為標簽本身的名稱
print(soup.p.attrs)
# {'class': ['title'], 'name': 'dromouse'}
# 在這里,我們把 p 標簽的所有屬性打印輸出了出來,得到的類型是一個字典。
# 下面三種方法都可以獲取字典里的值,是等價的,結果都一樣
print(soup.p.get('class'))
# ['title']
print(soup.p['class'])
# ['title']
print(soup.p.attrs['class'])
# ['title']
# 還可以針對屬性或者內容進行修改
soup.p['class'] = "newClass"
print (soup.p)
#
The Dormouse's story
NavigableString
獲取了Tag,也就是獲取了節點內容,但是只想要獲取節點內部的內容怎么辦?只需使用.string即可。
# 獲取節點內容
print(soup.p.string)
# The Dormouse's story
print(type(soup.p.string))
#
遍歷文檔樹
在選取節點的時候,也可以先選取一個節點,然后以這個節點為基準選取它的子節點,父節點,子孫節點等等,下面就介紹常用的選取方法。
獲取直接子節點.contents .children屬性
.contents
tag的.contents屬性可以將tag的直接子節點以列表的方式輸出。
下面例子選取head節點為基準,.contents選取head的子節點title,然后以列表返回。
print(soup.head.contents)
# [
The Dormouse's story]輸出方式為列表,可以用列表索引來獲取它的某一個元素.
print(soup.head.contents[0])
#
The Dormouse's story.children
children屬性和contents屬性不同的是它返回的不是一個列表,而是一個生成器。可用for循環輸出結果。
print(soup.head.children)
#
for i in soup.head.children:
print(i)
#
The Dormouse's story獲取所有子孫節點:.descendants屬性
上面兩個屬性都只能獲取到基準節點的下一個節點,要想獲取節點的所有子孫節點,就可以使用descendants屬性了。它返回的也是一個生成器。
print(soup.descendants)
#
還有其他屬性如查找父節點,組父節點的屬性就不記錄了(平時很少用)。
搜索文檔樹
BeautifulSoup提供了一些查詢方法(find_all,find等),調用對應方法,輸入查詢參數就可以得到我們想要的內容了,可以理解為搜索引擎的功能。(百度/谷歌=查詢方法,查詢內容=查詢參數,返回的網頁=想要的內容)
下面介紹最常用的find_all方法。
find_all方法
作用:查找所有符合條件的元素,返回的是列表形式
API:find_all(name, attrs, recursive, text, **kwargs)
1. name
name 參數可以根據節點名來查找元素。
A. 傳字符串
最簡單的過濾器是字符串.在搜索方法中傳入一個字符串參數,BeautifulSoup會查找與字符串完整匹配的內容,下面的例子用于查找文檔中所有的
標簽。
print(soup.find_all('p'))
# 通常以下面方式寫比較好
print(soup.find_all(name='p'))
B.傳正則表達式
如果傳入正則表達式作為參數,Beautiful Soup會通過正則表達式的 match() 來匹配內容.下面例子中找出所有以p開頭的標簽。
import re
print(soup.find_all(re.compile('^p')))
C.傳列表
如果傳入列表參數,BeautifulSoup會將與列表中任一元素匹配的內容返回。下面代碼會找到HTML代碼中的head標簽和b標簽。
print(soup.find_all(['head','b']))
# [
The Dormouse's story, The Dormouse's story]2. attrs
find_all中attrs參數可以根據節點屬性查詢。
查詢時傳入的參數是字典類型。比如查詢id=link1的節點
print(soup.find_all(attrs={'id':'link1'}))
# []
對于常見的屬性,可以不用以attrs來傳遞,直接傳入查詢參數即可。比如id,class_(class為Python關鍵字,使用下劃線區分),如下:
print(soup.find_all(id='link1'))
print(soup.find_all(class_='sister'))
運行結果:
[]
[, Lacie, Tillie]
3. text
text 參數可以搜搜文檔中的字符串內容,與 name 參數的可選值一樣, text 參數接受 字符串 , 正則表達式 , 列表。下面代碼查找節點里內容中有story字符串的節點,并返回節點的內容。
print(soup.find_all(text=re.compile('story')))
# ["The Dormouse's story", "The Dormouse's story"]
find方法
find方法與find_all方法的區別:
find_all:查詢符合所有條件的元素,返回列表。
find:只查找第一個匹配到的元素,返回單個元素,類型tag。
查詢方法與find_all大同小異。示例:
print(soup.find(name='p')) # 查詢第一個p標簽
print(soup.find(text=re.compile('story'))) # 查找第一個節點內容中有story字符串的節點內容
運行結果:
The Dormouse's story
The Dormouse's story
關于BeautifulSoup的使用就這樣吧,常用個人就覺得用好find_all即可(=.=~)
參考鏈接
崔慶才 [Python3網絡爬蟲開發實戰]:4.2-使用Beautiful Soup
總結
以上是生活随笔為你收集整理的python httpstr find_Python爬虫 | BeautifulSoup使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 作用域 前缀_Python
- 下一篇: python自动化运维平台能用php开发