我再次回答这里的精彩人物问题:)
我最近开始回到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。但是,我似乎无法弄清楚在哪里或为什么。
非常感谢任何协助。
答案 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
...