吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python中BeatifulSoap解析HTML的三個實用小技巧詳解

jf_f8pIz0xS ? 來源:CSDN技術社區 ? 作者:LaoYuanPython ? 2021-04-15 13:51 ? 次閱讀

一、BeautifulSoup簡介

BeautifulSoup是Python爬蟲應用解析Html的利器,是Python三方模塊bs4中提供的進行HTML解析的類,可以認為是一個HTML解析工具箱,對HTML報文中的標簽具有比較好的容錯識別功能。lxml是一款html文本解析器,BeautifulSoup構建對象時需要指定HTML解析器,推薦使用lxml。

BeautifulSoup和lxml安裝命令:

1pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs4

2pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml

加載BeautifulSoup:

1from bs4 import BeautifulSoup

BeatifulSoap解析HTML報文的常用功能:

通過BeautifulSoup對象可以訪問標簽對應的html元素、并進一步訪問標簽的名字、屬性、html元素標簽對中的內容。

案例:

1from bs4 import BeautifulSoup

2import urllib.request

3def getURLinf(url):

4header = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36’}

5req = urllib.request.Request(url=url,headers=header)

6resp = urllib.request.urlopen(req,timeout=5)

7html = resp.read().decode()

8soup = BeautifulSoup(html,‘lxml’)

9return (soup,req,resp)

10soup,req ,resp = getURLinf(r‘https://blog.csdn.net/LaoYuanPython/article/details/111303395’)

11print(soup.p)

12print(soup.link)

13print(soup.title)

14print(soup.link.attrs)

15print(soup.link[‘rel’])

通過標簽的contents屬性,可以訪問其下嵌套的所有下級HTML元素,這些該標簽下的子標簽對應的HTML元素放到一個contents 指向的列表中。

如:print(soup.body.contents)

可以訪問標簽對應的父、子、兄弟及祖先標簽信息

使用strings屬性迭代訪問除標簽外的所有內容;

可以使用find、find_all、find_parent、find_parents等系列方法查找滿足特定條件的標簽;

使用select通過css選擇器定位特定標簽。

具體的大家可以參考老猿博客的免費專欄《爬蟲:https://blog.csdn.net/laoyuanpython/category_9103810.html》或付費專欄《Python爬蟲入門:https://blog.csdn.net/laoyuanpython/category_10762553.html》的相關介紹。

二、一些解析技巧

在HTML解析時,如果通過簡單的tag、或單個tag屬性(如id、class)或文本一次搜索或select定位是最簡單的,而有些情況需要使用組合方法才能處理。

2.1、通過標簽的多個屬性組合定位或查找

經常有些要定位的標簽有很多,按單個屬性查找也有很多,得使用多個屬性查找。如:

1《div id=“article_content” class=“article_content clearfix”》

2。。.。。.

3《/div》

4《div id=“article_content” class=“article_view”》

5。。.。。.

6《/div》

7《div id=“article_view” class=“article_view”》

8。。.。。.

9《/div》

上面的html文本中有多個id為article_content的div標簽,如果使用:

1》》》 text=“”“```html

2《div id=”article_content“ class=”article_content clearfix“》

3。。.。。.

4《/div》

5《div id=”article_content“ class=”article_view“》

6。。.。。.

7《/div》

8《div id=”article_view“ class=”article_view“》

9。。.。。.

10《/div》”“”

11》》》 s = BeautifulSoup(text,‘lxml’)

12》》》 s.select(‘div#article_content’)

13[《div class=“article_content clearfix” id=“article_content”》。。.。。.《/div》,

14《div class=“article_view” id=“article_content”》。。.。。.《/div》]

15》》》

就會返回兩條記錄。這時候就可以使用多標簽屬性定位的如下4種語句:

1》》》s.select(‘div#article_content[class=“article_content clearfix”]’)

2[《div class=“article_content clearfix” id=“article_content”》。。.。。.《/div》]

3》》》s.select(‘div[id=“article_content”][class=“article_content clearfix”]’)

4[《div class=“article_content clearfix” id=“article_content”》。。.。。.《/div》]

5》》》s.find_all(“div”,id=“article_content”,class_=‘article_content clearfix’)

6[《div class=“article_content clearfix” id=“article_content”》。。.。。.《/div》]

7》》》s.find_all(“div”,“#article_content”,class_=‘article_content clearfix’)

8[《div class=“article_content clearfix” id=“article_content”》。。.。。.《/div》]

以上四種方式是等價的,因為id可以用#來標記,class在查找時需要和Python關鍵字class區分,因此有上述不同方法,注意select的每個屬性必須用中括號括起來,不同屬性的中括號之間不能有空格,如果有空格表示的就不是查找同一標簽的屬性,空格后的屬性表示前一個屬性對應標簽的子孫標簽的屬性。

2.2、利用tag標簽關系定位內容

tag標簽關系包括父子、兄弟、祖先等關系,有時要查找或定位的內容本身不是很好定位,但結合其他標簽關系(主要是父子、祖先關系)則可以唯一確認。

案例:

這是CSDN的博文中關于博主個人信息的部分報文:

1《div class=“data-info d-flex item-tiling”》

2《dl class=“text-center” title=“1055”》

3《a href=“https://blog.csdn.net/LaoYuanPython” data-report-click=‘{“mod”:“1598321000_001”,“spm”:“1001.2101.3001.4310”}’ data-report-query=“t=1”》

4《dt》《span class=“count”》1055《/span》《/dt》

5《dd class=“font”》原創《/dd》

6《/a》

7《/dl》

8《dl class=“text-center” data-report-click=‘{“mod”:“1598321000_002”,“spm”:“1001.2101.3001.4311”}’ title=“22”》

9《a href=“https://blog.csdn.net/rank/writing_rank” target=“_blank”》

10《dt》《span class=“count”》22《/span》《/dt》

11《dd class=“font”》周排名《/dd》

12《/a》

13《/dl》

14《/div》

以上報文中,如果要取博主的原創文章數和周排名,原創文章數和博主周排名的tag標簽完全相同,二者都在span標簽內,標簽的屬性及值都相同,只是span標簽的父標簽dt標簽的兄弟標簽dd標簽的string的中文內容才能區分。對于這種情況,首先要通過祖先標簽《div class=“data-info d-flex item-tiling”》定位到祖先標簽,再在祖先標簽內通過中文字符串定位到要訪問屬性的兄弟標簽的子標簽,然后通過該子標簽找到其父標簽的父標簽,再通過該父標簽的dt子標簽的span子標簽訪問具體取值。

示例代碼如下:

1》》》 text=“”“

2《div class=”data-info d-flex item-tiling“》

3《dl class=”text-center“ title=”1055“》

4《a href=”https://blog.csdn.net/LaoYuanPython“ data-report-click=‘{”mod“:”1598321000_001“,”spm“:”1001.2101.3001.4310“}’ data-report-query=”t=1“》

5《dt》《span class=”count“》1055《/span》《/dt》

6《dd class=”font“》原創《/dd》

7《/a》

8《/dl》

9《dl class=”text-center“ data-report-click=‘{”mod“:”1598321000_002“,”spm“:”1001.2101.3001.4311“}’ title=”22“》

10《a href=”https://blog.csdn.net/rank/writing_rank“ target=”_blank“》

11《dt》《span class=”count“》22《/span》《/dt》

12《dd class=”font“》周排名《/dd》

13《/a》

14《/dl》

15《/div》”“”

16》》》 s = BeautifulSoup(text,‘lxml’)

17》》》 subSoup = s.select(‘[class=“data-info d-flex item-tiling”] [class=“font”]’)

18》》》 for item in subSoup:

19parent = item.parent

20if item.string==‘原創’:

21orignalNum = int(parent.select(‘.count’)[0].string)

22elif item.string==‘周排名’:

23weekRank = int(parent.select(‘.count’)[0].string)

24》》》 print(orignalNum,weekRank)

251055 22

26》》》

注意:上面的select使用的也是標簽的屬性來定位標簽,并且兩個中括號之間有空格,表明后一個要查找的標簽在前一個屬性對應標簽的子孫標簽范圍內。

2.3、分析前去除程序代碼避免干擾

在解析HTML報文時,絕大多數情況是需要分析有用的標簽信息,但作為技術文章,大部分的博文中都有代碼,這些代碼可能會對分析進行干擾。如本文中的代碼含有一些分析的HTML報文,如果獲取本文的完整HTML內容,這些報文在非代碼部分也會出現,此時要排除代碼的影響,可以將代碼先從分析內容中去除再來分析。

目前大多數技術平臺的博文編輯器都支持對代碼的標識,象markdown等編輯器代碼的標簽為code標檢,如果有其他編輯器用不同標簽的,只有確認了標簽名,都可以按下面介紹的類似方式來處理。

處理步驟如下:

獲取報文;

構建BeatifulSoap對象soup;

通過soup.code.extract()或soup.code.decompose()方式就從soup對象中去除了代碼部分,decompose方法與extract方法的區別就是decompose直接刪除對應對象數據而extract再刪除時將刪除對象單獨返回。

關于這部分內容的案例可以參考《https://blog.csdn.net/LaoYuanPython/article/details/114729045 n行Python代碼系列:四行程序分離HTML報文中的程序代碼》的詳細介紹。

三、小結

本文介紹了使用BeatifulSoap解析HTML報文的三個使用技巧,包括通過多屬性組合查找或定位標簽、通過結合多個標簽關系來定位標簽以及去除html報文中的代碼標簽來避免代碼對解析的影響。

編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • HTML
    +關注

    關注

    0

    文章

    278

    瀏覽量

    36542
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85040
收藏 人收藏

    評論

    相關推薦

    Python解析:通過庫實現代理請求與數據抓取

    Python,有多個庫可以幫助你實現代理請求和數據抓取。這些庫提供了豐富的功能和靈活的API,使得你可以輕松地發送HTTP請求、處理響應、解析HTML/XML/JSON數據,以及進
    的頭像 發表于 10-24 07:54 ?231次閱讀

    簡述光刻工藝的三個主要步驟

    “ 光刻作為半導體的關鍵工藝,其中包括3大步驟的工藝:涂膠、曝光、顯影。三個步驟有一異常,整個光刻工藝都需要返工處理,因此現場異常的處理顯得尤為關鍵”
    的頭像 發表于 10-22 13:52 ?836次閱讀

    自動發電控制系統具有三個基本功能

    自動發電控制系統(AGC)具有三個基本功能,這些功能在電力系統的運行和調度中發揮著重要作用。以下是這三個基本功能的詳細解析
    的頭像 發表于 10-03 15:05 ?823次閱讀

    基本理想電路元件的三個特征是什么

    基本理想電路元件是構成電路的基本單元,它們具有三個基本特征:電壓-電流關系、能量轉換和電路參數。以下是對這三個特征的分析: 電壓-電流關系 理想電路元件的電壓-電流關系是其最基本的特征之一。這種關系
    的頭像 發表于 08-25 09:38 ?1376次閱讀

    對稱相電壓的特點是哪三個方面

    相電壓的特點。 一、對稱相電壓的基本概念 1.1 相電壓的定義 相電壓是指在電力系統,由三個相位組成的電壓。這
    的頭像 發表于 08-12 18:18 ?1810次閱讀

    簡述極管的三個工作區域

    極管的三個區域,通常指的是其在不同工作條件下的狀態區域,即截止區、放大區和飽和區。這三個區域定義了極管在不同電壓和電流條件下的行為特性,對于理解和設計電子電路至關重要。
    的頭像 發表于 07-29 10:50 ?4166次閱讀

    可調變阻器三個引腳怎么區分

    可調變阻器,也稱為電位器或可變電阻器,是一種可以調節電阻值的電子元件。它廣泛應用于各種電子設備,如音頻設備、電源管理、電機控制等。可調變阻器有三個引腳,分別是固定端、滑動端和可調端。這三個引腳
    的頭像 發表于 07-24 11:12 ?1495次閱讀

    可調電阻三個腳各是什么

    可調電阻器,也稱為電位器或可變電阻器,是一種可調節電阻值的電子元件。它通常由三個腳(引腳)組成,分別是固定腳、滑動腳和可調腳。以下是對這三個腳的介紹: 固定腳(Fixed Terminal): 固定
    的頭像 發表于 07-24 11:06 ?2405次閱讀

    如何分別場效應管的三個

    場效應管(Field-Effect Transistor,簡稱FET)是一種半導體器件,廣泛應用于電子電路。它具有三個主要的引腳:源極(Source)、漏極(Drain)和柵極(Gate)。正確
    的頭像 發表于 07-14 09:14 ?1885次閱讀

    微波測量的三個基本參量是什么

    微波測量是電子工程領域中的一重要分支,它涉及到對微波信號的頻率、幅度、相位等參數的測量。在微波測量,有三個基本參量:頻率、幅度和相位。這三個參量是微波信號的基本特征,對于微波系統的
    的頭像 發表于 05-28 14:46 ?1544次閱讀

    怎樣用萬用表區分晶閘管三個管極呢?

    晶閘管是一種四層端半導體器件,主要用于交流電路的電壓和功率控制。它具有陽極、陰極和門極三個端子。
    的頭像 發表于 05-24 17:52 ?3334次閱讀

    如何判斷極管的三個極性

    極管是電子電路的基本元件之一,其性能的好壞直接影響到整個電路的性能。而判斷極管的三個極性(基極b、發射極e、集電極c)是電路分析和設計
    的頭像 發表于 05-21 15:26 ?7034次閱讀

    籬笆三個樁——記晶體極管的發明

    籬笆三個樁——記晶體極管的發明
    的頭像 發表于 05-12 08:14 ?878次閱讀
    一<b class='flag-5'>個</b>籬笆<b class='flag-5'>三個</b>樁——記晶體<b class='flag-5'>三</b>極管的發明

    CUBE FREERTOS三個三個任務之上的運行不起來是為什么?

    ((size_t)10240) 改的這三個。 xTaskCreate(sht21Entry,\"sht21_Task\",512,NULL,3,NULL
    發表于 05-11 08:04

    python解析netflow數據到csv的流程詳解

    本文主要講解了linux下通過tcpdump抓取netflow數據包,并將其導入到wireshark進行解析,然后通過wireshark導出數據為json文件,再通過python腳本將其解析為csv文件以便做數據分析。
    的頭像 發表于 05-01 11:18 ?727次閱讀
    <b class='flag-5'>python</b><b class='flag-5'>解析</b>netflow數據到csv的流程<b class='flag-5'>詳解</b>
    精英娱乐城开户| r百家乐官网娱乐下载| 孝感市| 百家乐官网筹码套装包邮| 大发888完整客户端| 玩百家乐官网犯法| 百家乐过滤工具| 百家乐官网开户就送现金| 网络百家乐金海岸破解软件| 百家乐官网长玩必输| 百家乐大小点桌子| 百家乐官网没有必胜| 送彩金百家乐平台| 百家乐官网最好的投注法| 杨公风水24山分金水法| 云博娱乐城| 大佬百家乐现金网| 甘洛县| 网站百家乐假| 澳门百家乐官网怎玩| 威尼斯人娱乐城进不了| 百家乐官网新注册送彩金| 大发888完整客户端| 风水学坐向24山| 利博国际| 百家乐斗地主下载| 哪个百家乐官网投注好| 大发888 真钱娱乐场| 墨尔本百家乐官网的玩法技巧和规则 | 大发8887s88| 百家乐官网几点不用补| 龙博线上娱乐| 百家乐赌场代理荐| 澳门百家乐官网海星王娱乐城| 大发888注册奖金| 百家乐什么牌最大| 澳门百家乐官网公试打法| 百家乐单注技巧| 百家乐官网最佳下注方法| 深圳太阳城酒店| 百家乐缆的打法|