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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BeautifulSoup解析库详解

發布時間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BeautifulSoup解析库详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BeautifulSoup是靈活又方便的網頁解析庫,處理高效,支持多種解析器

利用它不用編寫正則表達式即可方便地實現網頁信息的提取

安裝:pip3 install beautifulsoup4

用法詳解:

beautifulsoup支持的一些解析庫

解析器使用方法優勢劣勢
Python標準庫BeautifulSoup(makeup,"html.parser")python的內置標準庫,執行速度適中,文檔容錯能力強python2.7 or python3.2.2前的版本中文容錯能力差
lxml HTML解析器BeautifulSoup(makeup,"lxml")速度快,文檔容錯能力強需要安裝c語言庫
lxml XML解析器BeautifulSoup(makeup,"xmlr")速度快,唯一支持xml的解析器需要安裝c語言庫
html5libBeautifulSoup(makeup,"html5lib")最好的容錯性,以瀏覽器的方式解析文檔,生成HTML5格式的文檔速度慢,不依賴外部擴展

基本使用方法:

import bs4 from bs4 import BeautifulSoup#下面是一段不完整的 html代碼 html = ''' <html><head><title>The Demouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Domouse's story</b></p> <p class="story">Once upon a time there were three little sisters,and their name were <a href="http://examlpe.com/elele" class="sister" ld="link1"><!--Elsle--></a> <a href="http://examlpe.com/lacie" class="sister" ld="link2"><!--Elsle--></a> <a href="http://examlpe.com/title" class="sister" ld="link3"><title></a> and they lived the bottom of a wall</p> <p clas="stuy">..</p> '''soup = BeautifulSoup(html,'lxml')#將代碼補全,也就是容錯處理 print(soup.prettify())#選擇title這個標簽,并打印內容
print(soup.title.string)
輸出結果為: <html><head><title>The Demouse's story</title></head><body><p class="title" name="dromouse"><b>The Domouse's story</b></p><p class="story">Once upon a time there were three little sisters,and their name were<a class="sister" href="http://examlpe.com/elele" ld="link1"><!--Elsle--></a><a class="sister" href="http://examlpe.com/lacie" ld="link2"><!--Elsle--></a><a class="sister" href="http://examlpe.com/title" ld="link3"><title></title></a>and they lived the bottom of a wall</p><p clas="stuy">..</p></body> </html> The Demouse's story

標簽選擇器

如上面例程中的soup.title.string,就是選擇了title標簽

選擇元素:import bs4

from bs4 import BeautifulSoup#下面是一段不完整的 html代碼 html = ''' <html><head><title>The Demouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Domouse's story</b></p> <p class="story">Once upon a time there were three little sisters,and their name were <a href="http://examlpe.com/elele" class="sister" ld="link1"><!--Elsle--></a> <a href="http://examlpe.com/lacie" class="sister" ld="link2"><!--Elsle--></a> <a href="http://examlpe.com/title" class="sister" ld="link3"><title></a> and they lived the bottom of a wall</p> <p clas="stuy">..</p> '''soup = BeautifulSoup(html,'lxml') print(soup.title) print(type(soup.title)) print(soup.head) print(soup.p)
輸出結果為:
<title>The Demouse's story</title>
<class 'bs4.element.Tag'>
<head><title>The Demouse's story</title></head>
<p class="title" name="dromouse"><b>The Domouse's story</b></p>
#只輸出第一個匹配結果

獲取名稱:

import bs4 from bs4 import BeautifulSoup#下面是一段不完整的 html代碼 html = ''' <html><head><title>The Demouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Domouse's story</b></p> <p class="story">Once upon a time there were three little sisters,and their name were <a href="http://examlpe.com/elele" class="sister" ld="link1"><!--Elsle--></a> <a href="http://examlpe.com/lacie" class="sister" ld="link2"><!--Elsle--></a> <a href="http://examlpe.com/title" class="sister" ld="link3"><title></a> and they lived the bottom of a wall</p> <p clas="stuy">..</p> '''soup = BeautifulSoup(html,'lxml') print(soup.title.name)
輸出結果為:title 

獲取屬性: 

import bs4 from bs4 import BeautifulSoup#下面是一段不完整的 html代碼 html = ''' <html><head><title>The Demouse's story</title></head> <body> <p class="title" name="dromouse"><b>The Domouse's story</b></p> <p class="story">Once upon a time there were three little sisters,and their name were <a href="http://examlpe.com/elele" class="sister" ld="link1"><!--Elsle--></a> <a href="http://examlpe.com/lacie" class="sister" ld="link2"><!--Elsle--></a> <a href="http://examlpe.com/title" class="sister" ld="link3"><title></a> and they lived the bottom of a wall</p> <p clas="stuy">..</p> '''soup = BeautifulSoup(html,'lxml') print(soup.p.attrs['name']) print(soup.p['name'])
#注意soup.a.attrs或者soup.p['name']這兩種獲取屬性的方法都是可以的
#還有就是要注意中括號!!!

獲取內容:

如例程中所示,使用string方法,如:soup.title.string即可獲取內容

嵌套選擇:

如:print(soup.head.title.string)

子節點和子孫節點:

如:print(soup.p.contents)使用contents可以獲取p標簽的所有子節點,類型是一個列表 

也可以使用children,與contents不同的是,children是一個迭代器,獲取所有子節點,需要使用循環才能把他的內容取到如:

print(soup.p.children)

for i ,child in enumerate(soup.p.children):

  print(i,child)

此外還有一個屬性descendants,這個是獲取所有的子孫節點,同樣也是一個迭代器 

print(soup.p.descendants)

for i ,child in enumerate(soup.p.descendants):

  print(i,child)

注意:子節點,子孫節點和下面的父節點,祖先節點中使用的類似于soup.p語法,是獲取第一個匹配到的p標簽,所以這些節點也都是第一個匹配到的標簽所對應的節點

父節點和祖先節點:

parent屬性:獲取所有的父節點

parents屬性:獲取所有的祖先節點

兄弟節點:

next_siblings屬性

previous_siblings屬性

--------------------------------------------------------------------------------------------------------------------

標準選擇器

上面說的是標簽選擇器,速度比較快,但是不能滿足解析html文檔的需求的

find_all方法:

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

可根據標簽名、屬性、內容查找文檔

根據name進行查找:

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1"><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li lass="element">Foo</li><li lass="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml') print(soup.find_all('url')) 輸出結果為: [<url class="list" id="list-1"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">jay</li> </url>, <url class="list list-small" id="list-2"> <li lass="element">Foo</li> <li lass="element">Bar</li> </url>]

?返回結果可以看到為一個列表,可以對列表進行循環,然后對每一項元素進行查找,如:

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1"><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li lass="element">Foo</li><li lass="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml') for url in soup.find_all('url'):print(url.find_all('li'))輸出結果為: [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">jay</li>] [<li lass="element">Foo</li>, <li lass="element">Bar</li>]  

 根據attrs進行查找:

attrs傳入的參數為字典形式的參數,如:

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1" name='elements'><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li lass="element">Foo</li><li lass="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml')print(soup.find_all(attrs={'id':'list-1'}))#也可以soup.find_all(id='list-1')這樣的來進行查找 print(soup.find_all(attrs={'name':'elements'})) 輸出結果為: [<url class="list" id="list-1" name="elements"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">jay</li> </url>] [<url class="list" id="list-1" name="elements"> <li class="element">Foo</li> <li class="element">Bar</li> <li class="element">jay</li> </url>]

###注意:可以利用soup.find_all(id='list-1')這樣的來進行查找,但對于class屬性,需要寫成class_='內容'的形式,因為在python中,class是一個關鍵字,所以在這里當作屬性進行查找的時候,需要寫成class_的樣子

利用text進行查找:

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1" name='elements'><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li lass="element">Foo</li><li lass="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml')print(soup.find_all(text='Foo')) 輸出結果為: ['Foo', 'Foo'] 

find方法,用法跟find_all方法是完全一樣的,只不過find_all返回所有元素,是一個列表,find返回單個元素,列表中的第一個值

find(name,attrs,recurslve,text,**kwargs)

find_parents()

find_parent()

find_next_siblings()

find_next_sibling()

find_previous_siblings()

find_previous_sibling()

find_all_next()

find_next()

find_all_previous()

find_previous()

這些函數的用法都一樣,只不過實現的方式不一樣

css選擇器

通過select()直接傳入css選擇器即可完成選擇

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1" name='elements'><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li class="element">Foo</li><li class="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml')#如果選擇的是class,需要加上一個點,.panel .panel-heading print(soup.select('.panel .panel-heading')) #直接選擇標簽 print(soup.select('url li')) #選擇id,要用#來選 print(soup.select('#list-2 .element')) 輸出結果為: [<div class="panel-heading"> <h4>hello</h4> </div>] [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">jay</li>, <li class="element">Foo</li>, <li class="element">Bar</li>] [<li class="element">Foo</li>, <li class="element">Bar</li>]

?進行層層嵌套的選擇:

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1" name='elements'><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li class="element">Foo</li><li class="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml')for url in soup.select('url'):print(url.select('li')) 輸出結果為: [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">jay</li>] [<li class="element">Foo</li>, <li class="element">Bar</li>]

 獲取屬性 

 

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1" name='elements'><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li class="element">Foo</li><li class="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml')for url in soup.select('url'):print(url['id'])
   #也可以使用print(url.attrs['id']) 輸出結果為: list-1 list-2

 獲取內容:

import bs4 from bs4 import BeautifulSouphtml = ''' <div class="panel"><div class="panel-heading"><h4>hello</h4></div><div class="panel-body"><url class="list" id="list-1" name='elements'><li class="element">Foo</li><li class="element">Bar</li><li class="element">jay</li></url><url class="list list-small" id="list-2"><li class="element">Foo</li><li class="element">Bar</li></url></div></div> '''soup = BeautifulSoup(html,'lxml')for l in soup.select('li'):print(l.get_text()) 輸出結果為: Foo Bar jay Foo Bar

  

總結:

推薦使用lxml解析庫,必要時使用html.parser

標簽選擇篩選功能弱但是速度快

建議使用find(),find_all()查詢匹配單個結果或多個結果

如果對css選擇器熟悉建議使用select()

記住常用的獲取屬性和文本值的方法

 

 

 

  

?

轉載于:https://www.cnblogs.com/ronghe/p/9182537.html

總結

以上是生活随笔為你收集整理的BeautifulSoup解析库详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲爱爱网站 | 在线观看国产福利 | 欧美一区二区最爽乱淫视频免费看 | 男女男精品视频 | 精品美女在线观看 | 日日夜夜亚洲 | 久久精品国产一区 | 三上悠亚亚洲一区 | 亚洲精品一区二区 | 亚洲精品国产精品国自产观看 | 国产一区二区三区在线观看 | 国产精品久久久久久久久久妞妞 | 国产欧美视频一区二区三区 | 亚洲AV无码成人精品区在线观 | 久久婷婷五月综合色国产香蕉 | 日本一区二区三区免费观看 | 视频黄色免费 | 欧美大片大全 | 久久免费手机视频 | 干爹你真棒插曲免费 | 中文字幕第15页 | 亚洲夜夜操 | 久久久久99精品 | 亚洲精品一区二区三区四区乱码 | 村姑电影在线播放免费观看 | 成人欧美一区二区三区黑人 | 色综合色综合色综合 | 国产男女猛烈无遮挡 | 少妇熟女一区二区三区 | 夜夜撸av | 国产精品福利小视频 | 国产在线欧美 | 国产亚洲激情 | 在线观看日韩欧美 | 国产免费一区二区三区 | 好屌妞视频这里只有精品 | 国产精品久久久久久亚洲伦 | 少妇媚药按摩中文字幕 | 欧美日韩欧美 | 韩国av一区二区三区 | 公侵犯人妻一区二区三区 | jiizzyou性欧美老片 | 超碰夫妻 | 男人猛吃奶女人爽视频 | 成人在线视频一区 | 成人av影视在线观看 | 美女福利视频在线观看 | 成人黄色视屏 | 河北彩花中文字幕 | 欧美最猛黑人xxxx黑人猛交 | 欧美色老头old∨ideo | 777视频在线观看 | 午夜精品久久久久久久久久久 | 黄网站在线观看视频 | 亚洲草逼 | 青青草原综合久久大伊人精品 | 精品国产av 无码一区二区三区 | 国产精品视频看看 | 久久久久国产一区二区三区 | 国产激情自拍视频 | 欧美性受xxxx黑人猛交88 | 日韩精品一线二线三线 | 亚州春色 | 欧美嘿咻视频 | a视频| 毛片1000部免费看 | www.youjizz.com久久| jlzzjlzz亚洲女人18 | 欧美综合图片 | 色综合91| 国产h视频 | 自拍1区 | 中文在线天堂网 | 狠狠老司机 | 一级特黄aa大片 | 日本乱论视频 | 少妇精品无码一区二区免费视频 | 丰满圆润老女人hd | 女主播在线观看 | jizz亚洲女人 | 91tv国产成人福利 | 色接久久 | 亚拍一区 | 婷婷在线视频 | 国产福利一区视频 | 国产欧美综合一区 | 国内特级毛片 | 日本女优一区 | 日本一区视频 | 久久久免费精品 | 亚日韩在线 | 成人交性视频免费看 | 一区二区三区国产 | 夜夜嗨av禁果av粉嫩av懂色av | 伊人tv | 嫩草伊人久久精品少妇av | 亚洲黄网在线 | 致单身男女免费观看完整版 | 自由成熟xxxx色视频 |