Python、lxml 和 xpath:返回“[<Element x at 0x29a9998>] 而不是期望值

问题描述 投票:0回答:2

我正在尝试抓取 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&nbsp;&nbsp;
.

为了确保预期的数据被最初的“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 检索此元素的所需值的提示或技巧将不胜感激。如果我可以采用完全不同的方式来获得相同的结果,我也会对此感兴趣。

谢谢。

python html xpath lxml
2个回答
2
投票

在进一步谷歌搜索以找出元素是什么之后(它们是具有

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

0
投票

用于范围: 对于 x 的价格: 打印(x.文本)

© www.soinside.com 2019 - 2024. All rights reserved.