python解析HTML網(wǎng)頁(yè)代碼,獲取所有超鏈接

背景:領(lǐng)導(dǎo)讓統(tǒng)計(jì)點(diǎn)東西,之前一個(gè)頁(yè)面的都用JS操作的,這次不行了:要跳2個(gè)頁(yè)面才能獲取到數(shù)據(jù)(我的思路是先從第一個(gè)頁(yè)面獲取所有超鏈接放到一個(gè)數(shù)組里,然后循環(huán)遍歷,取第二個(gè)頁(yè)面里的數(shù)據(jù))。然后決定用剛學(xué)的PYTHON上手。(其實(shí)我這個(gè)整體思路就錯(cuò)了,應(yīng)該直接通過(guò)接口取數(shù)據(jù);而不是通過(guò)頁(yè)面URL;因?yàn)閁RL有可能是動(dòng)態(tài)生成的數(shù)據(jù),就算獲取到了url解析出來(lái)了,數(shù)據(jù)也是不全的...但也算加深學(xué)習(xí)python了)

思路:首先就是把請(qǐng)求頭(包括cookie)放在header里登錄網(wǎng)頁(yè)。第二步是獲取A標(biāo)簽。

from bs4

import BeautifulSoup

from urllib import request

import urllib.request

import chardet

import zlib

import requests

#1 數(shù)據(jù)url

url ="https://gxxxx.xxxx.cn/xxxxx"

#2 添加請(qǐng)求頭

header = {

? ? "method":"POST",

? ? "accept":"application/json, text/plain, */*",

? ? "accept-encoding":"gzip, deflate, br",

? ? "accept-language":"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",

? ? "content-type":"application/json;charset=UTF-8",

? ? "cookie":"xxxxxxxxxxxxxxxxxxx",

}

#3 構(gòu)建請(qǐng)求對(duì)象

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

#4 發(fā)送請(qǐng)求對(duì)象

response = urllib.request.urlopen(request)

#5 讀取并解析GZIP格式的頁(yè)面(這里踩過(guò)坑,一開(kāi)始解析出是都是亂碼;后來(lái)知道是因?yàn)間zip格式導(dǎo)致的;處理方式如下)

data = zlib.decompress(response.read(), 16+zlib.MAX_WBITS)

#打印data

print(data)

#調(diào)試打印解析出的文件的格式是什么

print (chardet.detect(data).get('encoding'))

soup = BeautifulSoup(data, 'html.parser', from_encoding='iso-8859-1')

print(soup.decode('UTF-8'))

# 找出所有的 a 標(biāo)簽, 因?yàn)樗械逆溄佣荚?a 標(biāo)簽內(nèi)

data = soup.find_all('a')

# 打開(kāi)文件對(duì)象做持久化操作

file =open('D:/link.txt', mode='w', encoding='UTF-8')

# 遍歷所有的 a 標(biāo)簽, 獲取它們的 href 屬性的值和它們的text

for itemin data:

if item.stringis not None and item['href'] !='javascript:;' and item['href'] !='#':

print(item.string, item.get('href'))

file.write(str.__add__(item.string, ' '))

file.write(str.__add__(item['href'], '\n'))

踩了3個(gè)坑:

1.一個(gè)是read源網(wǎng)頁(yè)后,發(fā)現(xiàn)都是亂碼;然后發(fā)現(xiàn)是gzip格式導(dǎo)致的;然后導(dǎo)入python的zlib庫(kù)解決的。

然后還百度了--->打印解析出的文件的格式的指令:#print (chardet.detect(html).get('encoding'))

2.最開(kāi)始寫得那版,其實(shí)沒(méi)有read,其實(shí)也是運(yùn)行成功了的;但是我看著返回結(jié)果不太對(duì),就又去read了一下源文件。然后出現(xiàn)了上述亂碼問(wèn)題。

第一版代碼:

第二版代碼:

3.成功解析出源碼后,發(fā)現(xiàn)比源HTML少了好多數(shù)據(jù)。一查,發(fā)現(xiàn)有些數(shù)據(jù)是js后期加載生成的.....也就是說(shuō)我這些都白寫了。

參考文章:

用python代碼模擬登錄網(wǎng)站https://www.cnblogs.com/lanyincao/p/10745474.html

python來(lái)獲取網(wǎng)頁(yè)中的所有鏈接https://www.cnblogs.com/li1234567980/p/12846077.html

在python中使用urllib2.urlopen獲取的html網(wǎng)頁(yè)不完整https://segmentfault.com/q/1010000007513722

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容