我正在尝试抓取 TD 资产管理页面(下面的示例;我不能发布超过两个链接)以检索“价格”值,即此 HTML 片段中的美元金额:
<div class="td-layout-grid9 td-layout-column td-layout-column-first">
Price As On: Jun 12, 2015
<br>
<strong>$14.54 </strong>
<strong class="td-copy-red">-0.01 (-0.07%)</strong>
</div>
我希望用 Python、requests、lxml 和 XPath 来实现这一点,我安装如下:
apt-get update
apt-get install python python-pip python-dev gcc build-essential libxml2-dev libxslt-dev libffi-dev libssl-dev
pip install lxml
pip install requests
pip install requests[security]
下一步,检索我这样做的页面:
python
>>> from lxml import html
>>> import requests
>>> page = requests.get('https://www.tdassetmanagement.com/fundDetails.form?fundId=6320&lang=en')
>>> tree = html.fromstring(page.text)
最后,尝试使用从 Chrome 的“检查元素”工具获得的相关元素的 XPath 来检索所需的美元值:
>>> price = tree.xpath('//*[@id="fundCardVO"]/div[2]/div[1]/div[1]/div[1]/strong[1]')
>>> print price
不幸的是,结果是
[<Element strong at 0x29a9998>]
而不是预期的美元金额$14.54
.
为了确保预期的数据被最初的“requests.get”检索到,我运行了这个:
>>> print page.content
结果可以在这里看到:http://pastebin.com/f5C4MFQb.
如果我将上面的 HTML 粘贴到此工具中:http://videlibri.sourceforge.net/cgi-bin/xidelcgi 我的 XPath 查询
//*[@id="fundCardVO"]/div[2]/div[1]/div[1]/div[1]/strong[1]
按预期返回美元金额。
任何关于我如何能够使用 Python、lxml 和 XPath 检索此元素的所需值的提示或技巧将不胜感激。如果我可以采用完全不同的方式来获得相同的结果,我也会对此感兴趣。
谢谢。
在进一步谷歌搜索以找出元素是什么之后(它们是具有
tag
或 text
等属性的事物列表),然后是关于 UnicodeEncodeError
的更多谷歌搜索(参见 UnicodeEncodeError: 'ascii' codec can't在位置 20 中编码字符 u'\xa0':序号不在范围内(128))我可以用这个获得我想要的值:
>>> priceelement = tree.xpath('//*[@id="fundCardVO"]/div[2]/div[1]/div[1]/div[1]/strong[1]')
>>> priceascii = priceelement[0].text
>>> price = priceascii.encode('utf-8')
>>> print price
感谢 jonrsharpe 将我推向正确的方向。
虽然我仍然无法确定如何获取元素的可用属性列表,但是
tag
和 text
是可用的。
我继续得到这个数字(没有美元符号和尾随的不间断空格):
>>> import re
>>> p = re.search('[0-9]{1,3}\.[0-9]{2}', price)
>>> price = p.group(0)
>>> print price
用于范围: 对于 x 的价格: 打印(x.文本)