首頁 後端開發 Python教學 python中BeautifulSoup的詳細介紹(附程式碼)

python中BeautifulSoup的詳細介紹(附程式碼)

Dec 12, 2018 am 09:40 AM
python

這篇文章帶給大家的內容是關於python中BeautifulSoup的詳細介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜尋、修改分析樹等功能。它是一個工具箱,透過解析文件為使用者提供需要抓取的數據,因為簡單,所以不需要多少程式碼就可以寫出一個完整的應用程式。 Beautiful Soup會自動將輸入文件轉換為Unicode編碼,輸出文件轉換為utf-8編碼。你不需要考慮編碼方式,除非文件沒有指定一個編碼方式,這時,Beautiful Soup就不能自動辨識編碼方式了。然後,你只需要說明一下原始編碼方式就可以了。 Beautiful Soup已成為和lxml、html6lib一樣出色的python解釋器,為使用者靈活地提供不同的解析策略或強勁的速度。

安裝

pip install BeautifulSoup4
easy_install BeautifulSoup4
登入後複製

建立BeautifulSoup物件

首先應該要匯入BeautifulSoup類別函式庫from bs4 import BeautifulSoup

#下面開始建立物件,在開始之前為了方便演示,先創建一個html文本,如下:

html = """
<html><head><title>The Dormouse&#39;s story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse&#39;s story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
登入後複製

創建對象:soup=BeautifulSoup(html,'lxml'),這裡的lxml是解析的類庫,目前來說個人覺得最好的解析器了,一直在用這個,安裝方法:pip install lxml

#Tag

Tag就是html中的標籤,用BeautifulSoup就能解析出來Tag的具體內容,具體的格式為soup.name,其中name是html下的標籤,具體實例如下:

print soup.title輸出title標籤下的內容,包括此標籤,這個將會輸出The Dormouse's story

print soup.head

##注意:

#這裡的格式只能取得這些標籤的第一個,後面會講到取得多個標籤的方法。其中對於Tag有兩個重要的屬性name和attrs,分別表示名字和屬性,介紹如下:

name:對於Tag,它的name就是其本身,如soup.p.name就是p

attrs是一個字典類型的,對應的是屬性-值,如print soup.p.attrs,輸出的就是{'class': ['title'], 'name': 'dromouse'},當然你也可以得到具體的值,如print soup.p.attrs['class'],輸出的就是[title]是一個列表的類型,因為一個屬性可能對應多個值,當然你也可以透過get方法得到屬性的,如:print soup.p.get('class')。也可以直接使用print soup.p['class']

get

#get方法來得到標籤下的屬性值,注意這是一個重要的方法,在許多場合都能用到,例如你要得到標籤下的圖像url,那麼就可以用soup.img.get('src'),具體解析如下:

print soup.p.get("class")   #得到第一个p标签下的src属性
登入後複製

string

得到標籤下的文字內容,只有在此標籤下沒有子標籤,或只有一個子標籤的情況下才能傳回其中的內容,否則傳回的是None具體實例如下:

print soup.p.string #在上面的一段文本中p标签没有子标签,因此能够正确返回文本的内容
print soup.html.string  #这里得到的就是None,因为这里的html中有很多的子标签
登入後複製

get_text()

可以取得一個標籤中的所有文字內容,包括子孫節點的內容,這是最常用的方法

搜尋文件樹

find_all( name , attrs , recursive , text , **kwargs )

find_all是用來搜尋節點中所有符合篩選條件的節點

1.name參數:是Tag的名字,如p,p,title …..

soup.find_all("p") 找出所有的p標籤,返回的是[

The Dormouse's story],可以透過遍歷取得每一個節點,如下:

ps=soup.find_all("p")
for p in ps:
print p.get(&#39;class&#39;)   #得到p标签下的class属性
登入後複製

傳入正規表示式:soup.find_all(re.compile(r'^b')找出以b開頭的所有標籤,這裡的body和b標籤都會被查到

傳入類別清單:如果傳入清單參數,BeautifulSoup會將與清單中任一元素相符的內容傳回.下面程式碼找到文件中所有

標籤和標籤

2.KeyWords參數,就是傳入屬性和對應的屬性值,或是一些其他的表達式

soup.find_all( id='link2'),這個將會搜尋找到所有的id屬性為link2的標籤。傳入正規表示式soup.find_all(href=re.compile("elsie")),這個將會找出所有href屬性滿足正規表示式的標籤

傳入多個值:soup.find_all(id='link2',class_='title') ,這個將會查找到同時滿足這兩個屬性的標籤,這裡的class必須用class_傳入參數,因為class是python中的關鍵字

有些屬性不能透過以上方法直接搜索,例如html5中的data-*屬性,不過可以透過attrs參數指定一個字典參數來搜尋包含特殊屬性的標籤,如下:

# [<p data-foo="value">foo!</p>]
data_soup.find_all(attrs={"data-foo": "value"})   #注意这里的atts不仅能够搜索特殊属性,亦可以搜索普通属性
soup.find_all("p",attrs={&#39;class&#39;:&#39;title&#39;,&#39;id&#39;:&#39;value&#39;})  #相当与soup.find_all(&#39;p&#39;,class_=&#39;title&#39;,id=&#39;value&#39;)
登入後複製

3.text參數:透過text 參數可以搜搜文檔中的字串內容.與name 參數的可選值一樣, text 參數接受字串, 正規表示式, 列表, True

soup.find_all(text="Elsie")
# [u&#39;Elsie&#39;]
 
soup.find_all(text=["Tillie", "Elsie", "Lacie"])
# [u&#39;Elsie&#39;, u&#39;Lacie&#39;, u&#39;Tillie&#39;]
 
soup.find_all(text=re.compile("Dormouse"))
[u"The Dormouse&#39;s story", u"The Dormouse&#39;s story"]
登入後複製

4.limit参数:find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果.

文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量,代码如下:

soup.find_all("a", limit=2)
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
登入後複製

5.recursive 参数:调用tag的 find_all() 方法时,BeautifulSoup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False

find( name , attrs , recursive , text , **kwargs )
登入後複製

它与 find_all() 方法唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果,就是直接返回第一匹配到的元素,不是列表,不用遍历,如soup.find("p").get("class")

css选择器

我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加#,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list

通过标签名查找

print soup.select(&#39;title&#39;) 
#[<title>The Dormouse&#39;s story</title>]
print soup.select(&#39;a&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
登入後複製

通过类名查找

print soup.select(&#39;.sister&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
登入後複製

通过id名查找

print soup.select(&#39;#link1&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
登入後複製

组合查找

学过css的都知道css选择器,如p #link1是查找p标签下的id属性为link1的标签

print soup.select(&#39;p #link1&#39;)    #查找p标签中内容为id属性为link1的标签
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
print soup.select("head > title")   #直接查找子标签
#[<title>The Dormouse&#39;s story</title>]
登入後複製

属性查找

查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。

print soup.select(&#39;a[class="sister"]&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
print soup.select(&#39;a[href="http://example.com/elsie"]&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
登入後複製

同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格,代码如下:

print soup.select(&#39;p a[href="http://example.com/elsie"]&#39;)
#[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
登入後複製

以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容

soup = BeautifulSoup(html, &#39;lxml&#39;)
print type(soup.select(&#39;title&#39;))
print soup.select(&#39;title&#39;)[0].get_text()
for title in soup.select(&#39;title&#39;):
    print title.get_text()
登入後複製

修改文档树

Beautiful
Soup的强项是文档树的搜索,但同时也可以方便的修改文档树,这个虽说对于一些其他的爬虫并不适用,因为他们都是爬文章的内容的,并不需要网页的源码并且修改它们

修改tag的名称和属性

html="""
<p><a href=&#39;#&#39;>修改文档树</a></p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.a    #得到标签a,可以使用print tag.name输出标签
tag[&#39;class&#39;]=&#39;content&#39;    #修改标签a的属性class和p
tag[&#39;p&#39;]=&#39;nav&#39;
登入後複製

修改.string

注意这里如果标签的中还嵌套了子孙标签,那么如果直接使用string这个属性会将这里的所有的子孙标签都覆盖掉

html="""
<p><a href=&#39;#&#39;>修改文档树</a></p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.a
tag.string=&#39;博客&#39;   #这里会将修改文档树变成修改的内容
print  tag
soup.p.string=&#39;博客&#39;   #这里修改了p标签的内容,那么就会覆盖掉a标签,直接变成的修改后的文本
print soup
登入後複製

append

append的方法的作用是在在原本标签文本后面附加文本,就像python中列表的append方法

html="""
<p><a href=&#39;#&#39;>修改文档树</a></p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
soup.a.append("博客")    #在a标签和面添加文本,这里的文本内容将会变成修改文档树陈加兵的博客
print soup
print soup.a.contents    #这里输出a标签的内容,这里的必定是一个带有两个元素的列表
登入後複製

注意这里的append方法也可以将一个新的标签插入到文本的后面,下面将会讲到

new_tag

相信学过js的朋友都知道怎样创建一个新的标签,这里的方法和js中的大同小异,使用的new_tag
html="""
<p><p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.p
new_tag=soup.new_tag(&#39;a&#39;)    #创建一个新的标签a
new_tag[&#39;href&#39;]=&#39;#&#39;    #添加属性
new_tag.string=&#39;博客&#39;  #添加文本
print new_tag      
tag.append(new_tag)    #将新添加的标签写入到p标签中
print tag
登入後複製

insert

Tag.insert() 方法与 Tag.append() 方法类似,区别是不会把新元素添加到父节点 .contents
属性的最后,而是把元素插入到指定的位置.与Python列表总的 .insert() 方法的用法下同:
html="""
<p><p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.p
new_tag=soup.new_tag(&#39;a&#39;)
new_tag[&#39;href&#39;]=&#39;#&#39;
new_tag.string=&#39;博客&#39;
tag.append("欢迎来到")  #这里向p标签中插入文本,这个文本在contents下的序号为0
tag.insert(1,new_tag)   #在contents序号为1的位置插入新的标签,如果这里修改成0,那么将会出现a标签将会出现在欢饮来到的前面
print tag
登入後複製
注意这的1是标签的内容在contents中的序号,可以用print tag.contents查看当前的内容

insert_before() 和 insert_after()

insert_before() 方法在当前tag或文本节点前插入内容,insert_after() 方法在当前tag或文本节点后插入内容:

soup = BeautifulSoup("<b>stop</b>")
tag = soup.new_tag("i")
tag.string = "Don&#39;t"
soup.b.string.insert_before(tag)
soup.b
# <b><i>Don&#39;t</i>stop</b>
soup.b.i.insert_after(soup.new_string(" ever "))
soup.b
# <b><i>Don&#39;t</i> ever stop</b>
soup.b.contents
# [<i>Don&#39;t</i>, u&#39; ever &#39;, u&#39;stop&#39;]
登入後複製

clear

clear用来移除当前节点的所有的内容,包括其中的子孙节点和文本内容

html="""
<p><p>
"""
soup=BeautifulSoup(html,&#39;lxml&#39;)
tag=soup.p
new_tag=soup.new_tag(&#39;a&#39;)
new_tag[&#39;href&#39;]=&#39;#&#39;
new_tag.string=&#39;博客&#39;
tag.append("欢迎来到")
tag.insert(1,new_tag)
tag.clear()    #这里将会移除所有内容
print tag
登入後複製

以上是python中BeautifulSoup的詳細介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles