整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          解析HTML報文的三個實用技巧之BeatifulSoap

          、BeautifulSoup簡介

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

          BeautifulSoup和lxml安裝命令:

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

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

          加載BeautifulSoup

          1.from bs4 import BeautifulSoup

          BeatifulSoap解析HTML報文的常用功能

          1. 通過BeautifulSoup對象可以訪問標簽對應的html元素、并進一步訪問標簽的名字、屬性、html元素標簽對中的內容。
            案例from bs4 import BeautifulSoup
          2. import urllib.request
          3. def getURLinf(url):
          4. header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
          5. req = urllib.request.Request(url=url,headers=header)
          6. resp = urllib.request.urlopen(req,timeout=5)
          7. html = resp.read().decode()

          8. soup = BeautifulSoup(html,'lxml')
          9. return (soup,req,resp)

          10. soup,req ,resp = getURLinf
          11. print(soup.p)
          12. print(soup.link)
          13. print(soup.title)
          14. print(soup.link.attrs)
          15. print(soup.link['rel'])

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

          如:print(soup.body.contents)

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

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

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

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


          二、一些解析技巧

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

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

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

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

          案例:

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

          1. <div class="data-info d-flex item-tiling">
          2. <dl class="text-center" title="1055">
          3. <a href=" " 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=" " 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=" " 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=" " 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:
          19. parent = item.parent
          20. if item.string=='原創':
          21. orignalNum = int(parent.select('.count')[0].string)
          22. elif item.string=='周排名':
          23. weekRank = int(parent.select('.count')[0].string)

          24. >>> print(orignalNum,weekRank)
          25. 1055 22
          26. >>>


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

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

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

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

          處理步驟如下:

          獲取報文;

          構建BeatifulSoap對象soup;

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

          三、小結

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

          寫字不易,敬請支持:

          如果閱讀本文于您有所獲,敬請點贊、評論、收藏,謝謝大家的支持!

          ————————————————

          版權聲明:本文為轉載文章,如有侵權,請聯系作者刪除。

          家好,我是Python進階者。

          一、前言

          前幾天在Python最強王者交流群【ZXS】問了一個Python網絡爬蟲實戰問題。問題如下:

          我這里遇到一個問題:【爬取免費IP代理時,無法解析到數據】, 我通過 xpath,css定位到了元素,但是在運行時返回空列表,請問我該怎么解決呀 以下是解析數據的截圖:

          他自己提供了數據和寫的代碼如下:

          不過代碼得到的結果不是自己想要的。

          二、實現過程

          這里【吳超建】給了一個思路:css貌似寫得不對。并且給出了對應html解析。

          后來才發現粉絲自己把網站搞錯了,真是太尷尬了。

          不過針對粉絲當前的代碼,不換網站的話,修改xpath后也是可以跑的通的。

          順利地解決了粉絲的問題。

          如果你也有類似這種Python相關的小問題,歡迎隨時來交流群學習交流哦,有問必答!

          通過這個粉絲需求問答,我們確切的感受到了AI助力Python實戰需求的能力了,我最近也是一直在接觸AIGC,從最開始的ChatGPT到最近火爆出圈的Sora,也建立了自己的AIGC分享群,目前也帶動了500以上的AIGC愛好者一起學習,群里每周都會分享AIGC相關的內容,從認識AIGC,到使用AIGC,再到利用AIGC變現,我會帶大家一起進軍AIGC時代。大家可以在后臺加我v,我拉你們進入AIGC學習群!

          三、總結

          大家好,我是Python進階者。這篇文章主要盤點了一個Python庫安裝的問題,文中針對該問題,給出了具體的解析和代碼實現,幫助粉絲順利解決了問題。

          最后感謝粉絲【ZXS】提出的問題,感謝【吳超建】給出的思路,感謝【莫生氣】等人參與學習交流。

          【提問補充】溫馨提示,大家在群里提問的時候。可以注意下面幾點:如果涉及到大文件數據,可以數據脫敏后,發點demo數據來(小文件的意思),然后貼點代碼(可以復制的那種),記得發報錯截圖(截全)。代碼不多的話,直接發代碼文字即可,代碼超過50行這樣的話,發個.py文件就行。

          網頁開發過程中,我們有時會遇到HTML頁面白屏的問題,即打開網頁時頁面顯示空白,沒有任何內容。這不僅令用戶困惑,也使開發者頭疼不已。本文將分享一些常見的HTML頁面白屏問題解決方法,幫助你快速解決這個問題,讓你的網頁煥然一新!

          第一步:檢查HTML代碼

          首先,我們需要檢查HTML代碼是否正確。常見的錯誤包括標簽未閉合、標簽嵌套錯誤等。這些錯誤可能會導致頁面無法正常顯示。因此,仔細檢查HTML代碼,確保沒有語法錯誤是解決白屏問題的第一步。

          第二步:檢查CSS文件

          HTML頁面的樣式通常由CSS文件控制。如果CSS文件中存在錯誤或者無法正常加載,可能會導致頁面白屏。我們可以通過以下步驟檢查CSS文件是否存在問題:

          1、檢查CSS文件路徑是否正確:確保CSS文件的路徑正確,并且文件存在于指定的位置。可以通過瀏覽器開發者工具查看網絡面板,檢查CSS文件是否被成功加載。

          2、檢查CSS文件語法錯誤:使用CSS驗證工具,如W3C CSS驗證服務,檢查CSS文件是否存在語法錯誤。如果存在錯誤,及時修復。

          3、檢查CSS選擇器和樣式規則:檢查CSS文件中的選擇器和樣式規則是否正確。可能存在選擇器與HTML元素不匹配或樣式規則沖突的情況。可以通過逐個注釋掉樣式規則,逐步排查問題。

          第三步:檢查JavaScript代碼

          JavaScript代碼也可能導致頁面白屏。以下是檢查JavaScript代碼的步驟:

          1、檢查JS文件路徑是否正確:與CSS文件類似,確保JS文件的路徑正確,并且文件存在于指定的位置。通過瀏覽器開發者工具查看控制臺面板,檢查是否有JS文件加載錯誤的提示信息。

          2、檢查JS代碼語法錯誤:使用JS語法檢查工具,檢查JS代碼是否存在語法錯誤。如果有錯誤,及時修復。

          3、檢查JS代碼邏輯錯誤:檢查JS代碼中的邏輯是否正確。可能存在變量未定義、函數未調用或者邏輯錯誤等問題。可以通過調試工具,如瀏覽器開發者工具中的調試器,逐步排查問題。

          第四步:排查網絡請求問題

          如果前面的步驟都沒有發現問題,那么可能是網絡請求出現了問題。以下是一些排查網絡請求問題的方法:

          1、檢查網絡連接:確保你的設備已連接到互聯網,并且網絡連接穩定。

          2、檢查資源加載狀態:通過瀏覽器開發者工具的網絡面板,檢查頁面中的資源加載狀態。可能存在資源加載失敗或者超時的情況,導致頁面白屏。

          3、檢查服務器配置:如果你使用了服務器端腳本語言,如PHP,檢查服務器配置是否正確。可能存在服務器配置問題導致頁面無法正確渲染。

          第五步:優化頁面性能

          如果以上方法都沒有解決問題,那么可能是頁面性能問題導致白屏。以下是一些優化頁面性能的方法:

          1、壓縮和合并文件:將CSS和JS文件進行壓縮和合并,減少文件的大小和數量,提高頁面加載速度。

          2、使用緩存:利用瀏覽器緩存機制,將靜態資源進行緩存,減少服務器的請求次數,提高頁面加載速度。

          3、異步加載資源:使用異步加載技術,如異步加載JS文件或使用延遲加載,減少頁面加載時間。

          4、減少HTTP請求:減少頁面中的HTTP請求次數等。

          結語:

          通過以上五個步驟,我們可以逐步排查HTML頁面白屏問題,并解決它們。不同的問題可能需要不同的解決方法,因此需要耐心和細心地分析和排查。在開發過程中,我們也要時刻關注頁面性能,優化頁面加載速度,提高用戶體驗。


          主站蜘蛛池模板: 亚洲人AV永久一区二区三区久久| 久久亚洲中文字幕精品一区| 精品国产一区二区三区AV | 日韩精品免费一区二区三区| 精品人妻系列无码一区二区三区| 国产嫖妓一区二区三区无码| 国产一区二区三区在线观看影院 | 精品一区二区三区视频| 麻豆国产在线不卡一区二区| 国产一区二区三区在线2021| 亚洲国产成人一区二区三区| 99精品国产高清一区二区| 精品人妻无码一区二区三区蜜桃一 | 色婷婷综合久久久久中文一区二区| 色欲精品国产一区二区三区AV| 国产精品视频一区二区三区四 | 福利一区二区视频| 久久久久一区二区三区| 91视频国产一区| 波多野结衣精品一区二区三区| 久久国产精品最新一区| 日韩毛片一区视频免费| 国产一区二区三区在线电影| 在线播放精品一区二区啪视频| 国产福利精品一区二区| 视频一区二区中文字幕| 国产主播一区二区三区在线观看| 91福利国产在线观一区二区| 亚欧色一区W666天堂| 精品国产日韩亚洲一区在线| 欧洲精品码一区二区三区免费看 | 亚洲福利视频一区| 男人的天堂亚洲一区二区三区| 亚洲欧洲日韩国产一区二区三区| 亲子乱AV视频一区二区| 精品欧洲AV无码一区二区男男| 中文字幕一区二区三区乱码| 国产精品第一区揄拍| 亚洲av片一区二区三区| 一区二区三区精密机械| 精品女同一区二区三区免费播放|