日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python httpstr find_Python爬虫 | BeautifulSoup使用

發布時間:2025/4/17 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 story

first item

上面HTML文檔中的head、title、ur、li都是HTML標簽(節點名稱),這些標簽加上里面的內容就是tag。

獲取Tags

# 導入模塊

from bs4 import BeautifulSoup

html = """

The Dormouse's story

The 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 story

print(type(soup.title))

#

print(soup.head)

#

The Dormouse's story

print(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使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。