Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、BeautifulSoup簡介
BeautifulSoup是Python爬蟲應(yīng)用解析Html的利器,是Python三方模塊bs4中提供的進行HTML解析的類,可以認(rèn)為是一個HTML解析工具箱,對HTML報文中的標(biāo)簽具有比較好的容錯識別功能。lxml是一款html文本解析器,BeautifulSoup構(gòu)建對象時需要指定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報文的常用功能:
通過標(biāo)簽的contents屬性,可以訪問其下嵌套的所有下級HTML元素,這些該標(biāo)簽下的子標(biāo)簽對應(yīng)的HTML元素放到一個contents 指向的列表中。
如:print(soup.body.contents)
可以訪問標(biāo)簽對應(yīng)的父、子、兄弟及祖先標(biāo)簽信息;
使用strings屬性迭代訪問除標(biāo)簽外的所有內(nèi)容;
可以使用find、find_all、find_parent、find_parents等系列方法查找滿足特定條件的標(biāo)簽;
使用select通過css選擇器定位特定標(biāo)簽。
二、一些解析技巧
在HTML解析時,如果通過簡單的tag、或單個tag屬性(如id、class)或文本一次搜索或select定位是最簡單的,而有些情況需要使用組合方法才能處理。
2.1、通過標(biāo)簽的多個屬性組合定位或查找
經(jīng)常有些要定位的標(biāo)簽有很多,按單個屬性查找也有很多,得使用多個屬性查找。如:
上面的html文本中有多個id為article_content的div標(biāo)簽,如果使用:
就會返回兩條記錄。這時候就可以使用多標(biāo)簽屬性定位的如下4種語句:
以上四種方式是等價的,因為id可以用#來標(biāo)記,class在查找時需要和Python關(guān)鍵字class區(qū)分,因此有上述不同方法,注意select的每個屬性必須用中括號括起來,不同屬性的中括號之間不能有空格,如果有空格表示的就不是查找同一標(biāo)簽的屬性,空格后的屬性表示前一個屬性對應(yīng)標(biāo)簽的子孫標(biāo)簽的屬性。
2.2、利用tag標(biāo)簽關(guān)系定位內(nèi)容
tag標(biāo)簽關(guān)系包括父子、兄弟、祖先等關(guān)系,有時要查找或定位的內(nèi)容本身不是很好定位,但結(jié)合其他標(biāo)簽關(guān)系(主要是父子、祖先關(guān)系)則可以唯一確認(rèn)。
案例:
這是博文中關(guān)于博主個人信息的部分報文:
以上報文中,如果要取博主的原創(chuàng)文章數(shù)和周排名,原創(chuàng)文章數(shù)和博主周排名的tag標(biāo)簽完全相同,二者都在span標(biāo)簽內(nèi),標(biāo)簽的屬性及值都相同,只是span標(biāo)簽的父標(biāo)簽dt標(biāo)簽的兄弟標(biāo)簽dd標(biāo)簽的string的中文內(nèi)容才能區(qū)分。對于這種情況,首先要通過祖先標(biāo)簽<div class="data-info d-flex item-tiling">定位到祖先標(biāo)簽,再在祖先標(biāo)簽內(nèi)通過中文字符串定位到要訪問屬性的兄弟標(biāo)簽的子標(biāo)簽,然后通過該子標(biāo)簽找到其父標(biāo)簽的父標(biāo)簽,再通過該父標(biāo)簽的dt子標(biāo)簽的span子標(biāo)簽訪問具體取值。
示例代碼如下:
注意:上面的select使用的也是標(biāo)簽的屬性來定位標(biāo)簽,并且兩個中括號之間有空格,表明后一個要查找的標(biāo)簽在前一個屬性對應(yīng)標(biāo)簽的子孫標(biāo)簽范圍內(nèi)。
2.3、分析前去除程序代碼避免干擾
在解析HTML報文時,絕大多數(shù)情況是需要分析有用的標(biāo)簽信息,但作為技術(shù)文章,大部分的博文中都有代碼,這些代碼可能會對分析進行干擾。如本文中的代碼含有一些分析的HTML報文,如果獲取本文的完整HTML內(nèi)容,這些報文在非代碼部分也會出現(xiàn),此時要排除代碼的影響,可以將代碼先從分析內(nèi)容中去除再來分析。
目前大多數(shù)技術(shù)平臺的博文編輯器都支持對代碼的標(biāo)識,象markdown等編輯器代碼的標(biāo)簽為code標(biāo)檢,如果有其他編輯器用不同標(biāo)簽的,只有確認(rèn)了標(biāo)簽名,都可以按下面介紹的類似方式來處理。
處理步驟如下:
獲取報文;
構(gòu)建BeatifulSoap對象soup;
通過soup.code.extract()或soup.code.decompose()方式就從soup對象中去除了代碼部分,decompose方法與extract方法的區(qū)別就是decompose直接刪除對應(yīng)對象數(shù)據(jù)而extract再刪除時將刪除對象單獨返回。
三、小結(jié)
本文介紹了使用BeatifulSoap解析HTML報文的三個使用技巧,包括通過多屬性組合查找或定位標(biāo)簽、通過結(jié)合多個標(biāo)簽關(guān)系來定位標(biāo)簽以及去除html報文中的代碼標(biāo)簽來避免代碼對解析的影響。
寫字不易,敬請支持:
如果閱讀本文于您有所獲,敬請點贊、評論、收藏,謝謝大家的支持!
————————————————
版權(quán)聲明:本文為轉(zhuǎn)載文章,如有侵權(quán),請聯(lián)系作者刪除。
家好,我是Python進階者。
前幾天在Python最強王者交流群【ZXS】問了一個Python網(wǎng)絡(luò)爬蟲實戰(zhàn)問題。問題如下:
我這里遇到一個問題:【爬取免費IP代理時,無法解析到數(shù)據(jù)】, 我通過 xpath,css定位到了元素,但是在運行時返回空列表,請問我該怎么解決呀 以下是解析數(shù)據(jù)的截圖:
他自己提供了數(shù)據(jù)和寫的代碼如下:
不過代碼得到的結(jié)果不是自己想要的。
這里【吳超建】給了一個思路:css貌似寫得不對。并且給出了對應(yīng)html解析。
后來才發(fā)現(xiàn)粉絲自己把網(wǎng)站搞錯了,真是太尷尬了。
不過針對粉絲當(dāng)前的代碼,不換網(wǎng)站的話,修改xpath后也是可以跑的通的。
順利地解決了粉絲的問題。
如果你也有類似這種Python相關(guān)的小問題,歡迎隨時來交流群學(xué)習(xí)交流哦,有問必答!
通過這個粉絲需求問答,我們確切的感受到了AI助力Python實戰(zhàn)需求的能力了,我最近也是一直在接觸AIGC,從最開始的ChatGPT到最近火爆出圈的Sora,也建立了自己的AIGC分享群,目前也帶動了500以上的AIGC愛好者一起學(xué)習(xí),群里每周都會分享AIGC相關(guān)的內(nèi)容,從認(rèn)識AIGC,到使用AIGC,再到利用AIGC變現(xiàn),我會帶大家一起進軍AIGC時代。大家可以在后臺加我v,我拉你們進入AIGC學(xué)習(xí)群!
大家好,我是Python進階者。這篇文章主要盤點了一個Python庫安裝的問題,文中針對該問題,給出了具體的解析和代碼實現(xiàn),幫助粉絲順利解決了問題。
最后感謝粉絲【ZXS】提出的問題,感謝【吳超建】給出的思路,感謝【莫生氣】等人參與學(xué)習(xí)交流。
【提問補充】溫馨提示,大家在群里提問的時候。可以注意下面幾點:如果涉及到大文件數(shù)據(jù),可以數(shù)據(jù)脫敏后,發(fā)點demo數(shù)據(jù)來(小文件的意思),然后貼點代碼(可以復(fù)制的那種),記得發(fā)報錯截圖(截全)。代碼不多的話,直接發(fā)代碼文字即可,代碼超過50行這樣的話,發(fā)個.py文件就行。
網(wǎng)頁開發(fā)過程中,我們有時會遇到HTML頁面白屏的問題,即打開網(wǎng)頁時頁面顯示空白,沒有任何內(nèi)容。這不僅令用戶困惑,也使開發(fā)者頭疼不已。本文將分享一些常見的HTML頁面白屏問題解決方法,幫助你快速解決這個問題,讓你的網(wǎng)頁煥然一新!
第一步:檢查HTML代碼
首先,我們需要檢查HTML代碼是否正確。常見的錯誤包括標(biāo)簽未閉合、標(biāo)簽嵌套錯誤等。這些錯誤可能會導(dǎo)致頁面無法正常顯示。因此,仔細檢查HTML代碼,確保沒有語法錯誤是解決白屏問題的第一步。
第二步:檢查CSS文件
HTML頁面的樣式通常由CSS文件控制。如果CSS文件中存在錯誤或者無法正常加載,可能會導(dǎo)致頁面白屏。我們可以通過以下步驟檢查CSS文件是否存在問題:
1、檢查CSS文件路徑是否正確:確保CSS文件的路徑正確,并且文件存在于指定的位置。可以通過瀏覽器開發(fā)者工具查看網(wǎng)絡(luò)面板,檢查CSS文件是否被成功加載。
2、檢查CSS文件語法錯誤:使用CSS驗證工具,如W3C CSS驗證服務(wù),檢查CSS文件是否存在語法錯誤。如果存在錯誤,及時修復(fù)。
3、檢查CSS選擇器和樣式規(guī)則:檢查CSS文件中的選擇器和樣式規(guī)則是否正確。可能存在選擇器與HTML元素不匹配或樣式規(guī)則沖突的情況。可以通過逐個注釋掉樣式規(guī)則,逐步排查問題。
第三步:檢查JavaScript代碼
JavaScript代碼也可能導(dǎo)致頁面白屏。以下是檢查JavaScript代碼的步驟:
1、檢查JS文件路徑是否正確:與CSS文件類似,確保JS文件的路徑正確,并且文件存在于指定的位置。通過瀏覽器開發(fā)者工具查看控制臺面板,檢查是否有JS文件加載錯誤的提示信息。
2、檢查JS代碼語法錯誤:使用JS語法檢查工具,檢查JS代碼是否存在語法錯誤。如果有錯誤,及時修復(fù)。
3、檢查JS代碼邏輯錯誤:檢查JS代碼中的邏輯是否正確。可能存在變量未定義、函數(shù)未調(diào)用或者邏輯錯誤等問題。可以通過調(diào)試工具,如瀏覽器開發(fā)者工具中的調(diào)試器,逐步排查問題。
第四步:排查網(wǎng)絡(luò)請求問題
如果前面的步驟都沒有發(fā)現(xiàn)問題,那么可能是網(wǎng)絡(luò)請求出現(xiàn)了問題。以下是一些排查網(wǎng)絡(luò)請求問題的方法:
1、檢查網(wǎng)絡(luò)連接:確保你的設(shè)備已連接到互聯(lián)網(wǎng),并且網(wǎng)絡(luò)連接穩(wěn)定。
2、檢查資源加載狀態(tài):通過瀏覽器開發(fā)者工具的網(wǎng)絡(luò)面板,檢查頁面中的資源加載狀態(tài)。可能存在資源加載失敗或者超時的情況,導(dǎo)致頁面白屏。
3、檢查服務(wù)器配置:如果你使用了服務(wù)器端腳本語言,如PHP,檢查服務(wù)器配置是否正確。可能存在服務(wù)器配置問題導(dǎo)致頁面無法正確渲染。
第五步:優(yōu)化頁面性能
如果以上方法都沒有解決問題,那么可能是頁面性能問題導(dǎo)致白屏。以下是一些優(yōu)化頁面性能的方法:
1、壓縮和合并文件:將CSS和JS文件進行壓縮和合并,減少文件的大小和數(shù)量,提高頁面加載速度。
2、使用緩存:利用瀏覽器緩存機制,將靜態(tài)資源進行緩存,減少服務(wù)器的請求次數(shù),提高頁面加載速度。
3、異步加載資源:使用異步加載技術(shù),如異步加載JS文件或使用延遲加載,減少頁面加載時間。
4、減少HTTP請求:減少頁面中的HTTP請求次數(shù)等。
結(jié)語:
通過以上五個步驟,我們可以逐步排查HTML頁面白屏問題,并解決它們。不同的問題可能需要不同的解決方法,因此需要耐心和細心地分析和排查。在開發(fā)過程中,我們也要時刻關(guān)注頁面性能,優(yōu)化頁面加載速度,提高用戶體驗。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。