【问题标题】:Having issues with Python xpath scraping遇到 Python xpath 抓取问题
【发布时间】:2016-01-20 02:05:08
【问题描述】:

我又回来问这里的好人了:)

我最近开始重新开始使用 Python(50% 是在 codcademy 完成的,哈哈),并决定制作一个快速脚本,用于在网络上抓取 CAD 中的黄金现货价格。这最终将成为更大脚本的一部分......但我非常生疏,并认为这将是一个很好的项目。

我的问题: 我一直在遵循http://docs.python-guide.org/en/latest/scenarios/scrape/ 的指南来完成我的目标,但是我的脚本总是返回/打印

<Element html at 0xRANDOM>

其中 RANDOM 是(我假设)随机十六进制数。无论我使用什么网站,都会发生这种情况。

我的代码:

#!/bin/python
#Scrape current gold spot price in CAD

from lxml import html
import requests

def scraped_price():
    page = requests.get('http://goldprice.org/gold-price-canada.html')
    tree = html.fromstring(page.content)

    print "The full page is: ", tree #added for debug WHERE ERROR OCCURS
    bid = tree.xpath("//span[@id='gpotickerLeftCAD_price']/text()")
    print "Scraped content: ", bid
    return bid
gold_scraper = scraped_price()

我的研究:

1) www.w3schools.com/xsl/xpath_syntax.asp

这是我想出使用 '//span' 来查找所有 'span' 对象然后使用 @id 将其缩小到我需要的对象的地方。

2)Scraping web content using xpath won't work

这让我觉得我只是有一个糟糕的 tree.xpath 设置。但是我似乎无法弄清楚在哪里或为什么。

任何帮助将不胜感激。

【问题讨论】:

    标签: python-2.7 xpath web-scraping


    【解决方案1】:

    &lt;Element html at 0xRANDOM&gt;

    您看到打印的是lxml.htmlElement字符串表示。如果要查看实际的 HTML 内容,请使用tostring()

    print(html.tostring(tree, pretty_print=True))
    

    您还打印了Scraped content: [],这实际上意味着没有与定位器匹配的元素。而且,如果您会看到之前打印出来的 HTML,那么在下载的源代码中实际上没有带有 id="gpotickerLeftCAD_price" 的元素。

    这个特定网站上的价格是通过定期发出的连续 JSONP GET 请求动态检索的。您可以考虑模拟这些请求,也可以通过selenium 保持更高级别的浏览器自动化。演示(使用PhantomJS headless browser):

    >>> import time
    >>> from selenium import webdriver
    >>> 
    >>> driver = webdriver.PhantomJS()
    >>> driver.get("http://goldprice.org/gold-price-canada.html")
    >>> while True:
    ...     print(driver.find_element_by_id("gpotickerLeftCAD_price").text)
    ...     time.sleep(1)
    ... 
    1,595.28
    1,595.28
    1,595.28
    1,595.28
    1,595.28
    1,595.19
    ...
    

    【讨论】:

    • 切换到 html.tostring 给我一个错误:Type 'str' cannot be serialized
    • 我不太确定我是否理解,我的代码在变量“tree”中有 html.fromstring 部分,当更改为“tostring”时会出现序列化错误。我不确定如何在我的代码中实施您的修复。我很抱歉,这是漫长的一天,我没有满负荷工作哈哈 - 也许硒对我来说是一个更好的主意,哈哈
    • @L8NIT3TR0UBL3 没关系,这是我正在执行的操作:gist.github.com/alecxe/353738460807a04faa2a。此外,用完整的故事更新了答案。
    • 绝对完美!我很抱歉这么密集哈哈,我可能会尝试两种方法,看看我最喜欢哪一种:)非常感谢:)
    • 只是一个快速插件,如果需要下载 PhantomJS 才能工作,我如何捆绑二进制文件或至少捆绑库,以便我可以从最终更大的程序中生成可执行文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多