簡體   English   中英

為什么我使用 xpath lxml 在 python 中收到一個空數組

[英]Why am I receiving an empty array in python using xpath lxml

我想從這個頁面中抓取: https://www.leagueofgraphs.com/summoner/na/samrick41#championsData-soloqueue以獲得角色的特定勝率值。

import requests
from lxml import html

url = 'https://www.leagueofgraphs.com/summoner/na/samrick41#championsData-soloqueue'
headers = {my headers here}
page = requests.get(url, headers=headers)
contents = page.content

tree = html.fromstring(contents)

print (tree.xpath('//*[@id="profileRoles"]/div[2]/div[2]/table/tbody/tr[2]/td[3]/a/progressbar/div[2]/text()'))

[]

我得到一個空數組作為響應。 我想我需要刪除“tbody”,因為至少我得到了一個元素到“progressbar”節點,不知道為什么。 但是從那里為什么我不能得到最后一個“div [2]”的百分比值。 我確信還有其他方法可以獲得我正在尋找的價值,但我覺得這應該可行,所以如果有人能啟發我,我不明白這里的一些東西,謝謝。

您得到了正確的響應,但您想要的 HTML 實際上是通過 javascript 加載的。 當您在瀏覽器中禁用 javascript 時,您可以看到這一點,您不會在 html 中看到進度條的任何子項。

在chrome中,您可以通過檢查頁面輕松禁用javascript,右側有三個點->更多工具->設置->向下滾動到調試器。 事實上,我總是在嘗試任何抓取之前執行此操作,如果網站中有任何功能,則通常 javascript 正在操縱 DOM。

你沒有得到帶有數字的漂亮整潔的圖像。 話雖如此,您想要的信息實際上是在進度data-value屬性中。

import requests
from lxml import html

url = 'https://www.leagueofgraphs.com/summoner/na/samrick41#championsData-soloqueue'

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Accept-Language': 'en-US,en;q=0.9',
}
page = requests.get(url, headers=headers)
contents = page.content

tree = html.fromstring(contents)

for a in tree.xpath('//td[3]/a/progressbar'):
    winrate = a.get('data-value')
    print('Winrate: ',round(float(winrate)*100,1),'%')

Output

Winrate:  52.0 %
Winrate:  45.5 %
Winrate:  37.5 %
Winrate:  100.0 %
Winrate:  0.0 %
Winrate:  0.0 %
Winrate:  0.0 %
...

我承認我一直很懶,因為我不確定您需要什么精確的數據,但這會讓您走得更遠。

這些值以 2dp 值出現,因此需要將其轉換為 %,round() function 我用來四舍五入到小數點后一位,我們必須將從 xpath 選擇器獲得的字符串轉換為浮點數值以便操縱它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM