【问题标题】:Python, lxml and xpath: returns "[<Element x at 0x29a9998>] rather than expected valuePython、lxml 和 xpath:返回“[<Element x at 0x29a9998>] 而不是预期值
【发布时间】:2015-08-29 15:09:59
【问题描述】:

我正在尝试抓取 TD 资产管理页面(以下示例;我不能发布两个以上的链接)以检索“开价”值,即 HTML 的 sn-p 中的美元金额:

<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

不幸的是,结果是[&lt;Element strong at 0x29a9998&gt;],而不是预期的美元金额$14.54&amp;nbsp;&amp;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 来检索此元素所需值的提示或技巧将不胜感激。如果有一种完全不同的方法可以让我获得相同的结果,我也会对此感兴趣。

谢谢。

【问题讨论】:

  • 您将获得一个包含单个 Element 的列表;到底是什么问题?
  • 问题是我不知道如何获得所需的$14.54&amp;nbsp;&amp;nbsp; 值。如果我执行&gt;&gt;&gt; print tree.xpath('//title/text()') 之类的操作,我会得到实际的标题,而当我尝试获取美元价值时,我会得到[&lt;Element strong at 0x29a9998&gt;]。我应该提到我是一个完整的初学者。感谢您的帮助。
  • 您是否尝试过阅读文档以了解 Element 是什么,或者使用例如dir 了解它的属性?

标签: python html xpath lxml


【解决方案1】:

在进一步谷歌搜索以找出哪些元素是(它们是具有tagtext 等属性的事物列表),然后是更多关于UnicodeEncodeError 的谷歌搜索(参见UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(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 引导我朝正确的方向前进。

我仍然无法确定如何获取元素的可用属性列表,但tagtext 可用。

我接着得到了这个数字(没有美元符号和尾随的不间断空格):

>>> import re
>>> p = re.search('[0-9]{1,3}\.[0-9]{2}', price)
>>> price = p.group(0)
>>> print price

【讨论】:

  • “我仍然无法确定如何获取元素的可用属性列表” - dir(priceelement[0])
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多