【问题标题】:what's the xpath to get href here?在这里获取href的xpath是什么?
【发布时间】:2015-03-14 18:19:40
【问题描述】:

我正在寻找从

获取 href 的 xpath
<a class="a-link-normal s-access-detail-page a-text-normal" title="Nikon Coolpix L330 - 20.2 MP Digital Camera with 26x zoom 35mm NIKKOR VR lens and FULL HD 720p (Black)" href="https://rads.stackoverflow.com/amzn/click/com/B00HQDBLDO" rel="nofollow noreferrer"><h2 class="a-size-base s-inline s-access-title a-text-normal">Nikon Coolpix L330 - 20.2 MP Digital Camera with 26x zoom 35mm NIKKOR VR lens and FULL HD 720p (Black)</h2></a>

我尝试了以下代码:

url = "http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=digital+camera&rh=i%3Aaps%2Ck%3Adigital+camera"
page = requests.get(url)
tree = html.fromstring(page.text)
hrefs = tree.xpath('//*/a/@href')
for href in hrefs:
    if "keywords=digital+camera" in href:
        print href

这里没有打印任何内容。

我不确定 xpath 是否可以做到这一点?这是链接:http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=digital+camera

【问题讨论】:

  • 有多种方法可以通过 xpath 访问它。由于我们没有看到完整的 HTML 代码(或链接),我们不知道表达式的可靠性。另外,为什么这个问题用 Python 标记?
  • @alecxe 问题已更新。谢谢
  • 谢谢。你有什么输入?我的意思是,链接标题是你可以依赖的?
  • 是的。链接是输入。我想获得像amazon.com/dp/B00HQDBLDO 这样的每个href。
  • @Tomalak 我在这里更新了我的代码。请建议。

标签: python html xpath html-parsing lxml


【解决方案1】:

试试这个。但如果你尝试不同的东西然后问你是否在某个地方受到打击,那总是好的。

//a[@title='Nikon Coolpix L330 - 20.2 MP Digital Camera with 26x zoom 35mm NIKKOR VR lens and FULL HD 720p (Black)']

【讨论】:

  • 但帖子中有一个href。同时试试这个 //a[@class='a-link-normal s-access-detail-page a-text-normal']/@href 它将获得该类的所有href。
  • 我需要获取该链接中以“keywords=digital+camera”结尾的所有href
  • 我试过了。我返回href,但不返回以“keywords=digital+camera”结尾的href。有什么想法吗?
  • 试试这个... //a[@class='a-link-normal s-access-detail-page a-text-normal'][contains(@href, 'keywords=digital +camera')] 我觉得这样就可以了..
  • 这是一个有效的 xpath,我收到错误:SyntaxError: invalid syntax
【解决方案2】:

真正的问题不是“如何通过xpath获取链接”,而是“如何获取包含需要通过xpath检索的链接的HTML代码”。

您在浏览器中看到的亚马逊页面是由它通过几个额外的异步调用和执行 javascript 构建的。您在page.text 中获得的 HTML 与您在浏览器中看到的完全不同。它不包含所需的链接,因为requests 不是浏览器,至少没有内置 javascript 引擎。

这里最简单的解决方案是在 selenium 的帮助下自动化真正的浏览器:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=digital+camera')

for link in driver.find_elements_by_xpath('//a[contains(@href, "keywords=digital+camera")]'):
    print link.get_attribute('href')

driver.close()

【讨论】:

  • 我在 mac 或 pc 上工作得很好。但是这个解决方案在 ec2 实例中无法工作,因为没有图形支持。我怎么能解决这个问题?
  • @c20ad4d76fe97759aa27a0c99bff67 phantomjs 无头浏览器(webdriver.PhantomJS)或虚拟显示器(请参阅xvfb)是通常的解决方案/解决方法。
  • 或者您可以尝试欺骗User-Agent 标头,这可能足以欺骗亚马逊为您提供页面的浏览器版本。更明智的选择是考虑您是否真的需要包含关键字的链接,或者您是否仍然可以解决您的任务而无需过多依赖亚马逊的“特定于浏览器”的 href 格式。
  • @alecxe 你能解释一下标题是怎么做的吗?我不太明白。我尝试使用 webdriver.PhantomJS(),但它什么也没打印。不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多