簡體   English   中英

xpath如何格式化路徑

[英]xpath how to format path

我想從網頁獲取@src值'/pol_il_DECK-SANTA-CRUZ-STAR-WARS-EMPIRE-STRIKES-BACK-POSTER-8-25-20135.jpg'

from lxml import html
import requests
URL = 'http://systemsklep.pl/pol_m_Kategorie_Deskorolka_Deski-281.html'
session = requests.session()
page = session.get(URL)
HTMLn = html.fromstring(page.content)
print    HTMLn.xpath('//html/body/div[1]/div/div/div[3]/div[19]/div/a[2]/div/div/img/@src')[0]

但是我不能。 無論我如何格式化xpath,我都無法工作。

我結合了requestsbeautiful soup庫。 它們都很棒,我會推薦它們用於抓取和解析/提取HTML。 如果您有復雜的刮job工作, scrapyscrapy真的很好。

因此,對於您的具體示例,我可以

from bs4 import BeautifulSoup
import requests

URL = 'http://systemsklep.pl/pol_m_Kategorie_Deskorolka_Deski-281.html'
r = requests.get(URL)

soup = BeautifulSoup(r.text, "html.parser")
specific_element = soup.find_all('a', class_="product-icon")[14]
res = specific_element.find('img')["data-src"]
print(res)

它將打印出來

/pol_il_DECK-SANTA-CRUZ-STAR-WARS-EMPIRE-STRIKES-BACK-POSTER-8-25-20135.jpg

本着@pmuntima回答的精神,如果您已經知道它是第14個源圖像,但是想保留在lxml ,則可以:

print HTMLn.xpath('//img/@data-src')[14]

要獲得該特定圖像。 它類似地報告:

/pol_il_DECK-SANTA-CRUZ-STAR-WARS-EMPIRE-STRIKES-BACK-POSTER-8-25-20135.jpg

如果要在XPath中建立索引(在非常大的結果集中可能更高效),則:

print HTMLn.xpath('(//img/@data-src)[14]')[0]

考慮到需要在XPath中加上括號,然后索引出.xpath始終返回的列表的第一個元素,這.xpath

仍然,如上面的評論中所討論的,嚴格地數字索引通常是易碎的刮擦模式。


更新:為什么瀏覽器檢查工具給出的XPath不能正確指向元素? 因為在基於動態JavaScript的更新過程之后,瀏覽器看到的內容與您的請求看到的內容不同。 您的請求未運行JS,並且未進行此類更新。 不同的內容,需要不同的地址-如果該地址是靜態且易碎的,無論如何。

這里的部分更新似乎正在使用src URI,該URI最初指向“我正在加載!”。 gif,然后將其替換為“ real” src值,這些值在data-src屬性中即可開始。

因此,您需要進行兩項更改:

  1. 解決您想要的內容的一種更強大的方法(從瀏覽器檢查轉移到程序獲取時不會中斷)
  2. data-src而不是src提取所需的URI,因為在程序提取中,JS並未像在瀏覽器中那樣完成其加載和切換技巧。

如果您知道與目標圖像關聯的文本,那可能就是竅門。 例如:

search_phrase = 'DECK SANTA CRUZ STAR WARS EMPIRE STRIKES BACK POSTER'
path = '//img[contains(@alt, "{}")]/@data-src'.format(search_phrase)
print HTMLn.xpath(path)[0]

之所以alt是因為alt屬性包含目標文本。 您查找圖像的alt屬性中包含搜索短語,然后獲取相應的data-src值。

暫無
暫無

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

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