Python xpath抓取问题

时间:2016-01-20 02:05:09

标签: python-2.7 xpath web-scraping

我再次回答这里的精彩人物问题:)

我最近开始回到python(50%在codcademy lol完成)并且决定制作一个快速的脚本,用于抓取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

这是我想要使用&#39; // span&#39;找到所有&#39; span&#39;对象然后使用@id将其缩小到我需要的那个。

2)Scraping web content using xpath won't work

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

非常感谢任何协助。

1 个答案:

答案 0 :(得分:1)

  

<Element html at 0xRANDOM>

您看到的内容是lxml.html&#39; Element字符串表示。如果您想查看实际的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
...