Python中的find_element_by_xpath
我在找网页上那部分内容:
<TR class='title'><TD colspan=3 bgcolor=#C0C0C0>Order number 6097279</TD></TR>
我想从文本中提取出一个数字,这个数字每次都不一样(比如:'订单号 6097279' 让我得到字符串 '6097279')。
我尝试了以下方法,但出现了“无法找到元素”的错误:
order_number = order_products.find_element_by_xpath("//TR[@class='title']");
错误信息如下:
in call_orderpage(https://www.daz3d.com/i/account/orderdetail?order=8104987)
Failed!
Error (NoSuchElementException): Message u'Unable to locate element: {"method":"xpath","selector":"//tr[@class=\'title\']"}'
Program finished!
把 TR
改成 tr
也没有什么区别。
为什么这个不行呢?我还有其他用 'class = phrasing' 的 find_element_by_xpath
查找,它们是可以的。
我正在使用的代码:
order_number = order_products.find_element_by_xpath("//TR[@class='title']");
根据我所了解,xpath 的元素名称不区分大小写。但无论大小写,我都得到同样的错误。
我得到的反馈是:
关于不“接受”答案的事,我为此道歉——一部分是因为我不知道我需要这样做,另一部分是我没有收到有回复的通知。
我会回去做出更正。
=====================================
编辑以回应 gfortune...
我根据你在回答中提供的信息更新了你的问题。将来,要么在这里回复评论,要么直接编辑你的问题,更新包含额外信息。编辑问题是最好的方法。我已经提交了一个编辑供同行审核,希望很快能看到结果。不幸的是,我们仍然缺少你问题的很多上下文。A) 你使用的是什么库?B) 更多代码。一行代码可能不够。C) 关于你正在解析的页面的更多信息。理想情况下,提供一个非常简短的测试案例来触发错误。 – gfortune
老实说,“评论”面板里的小字很难看。而且我没有收到回复的通知...
无论如何,我没有使用 lxml,因为我之前不明白它是什么。现在我对它有了更好的了解,会去看看它是怎么工作的,谢谢。
“order_products 变量”只是整个 HTML 的一个子块——它是我需要处理的 HTML 部分。页面本身有很多子列表的链接和我不需要使用的东西。我把它分开是为了在查找我需要的数据时减少麻烦。
我以为我已经发布了一个有效的代码修正——这里再贴一次。
order_number = order_products.find_element_by_xpath("//tr[@class='title even']");
你会注意到 'title even' 替代了 'title' 类...firepath 显示了那个隐藏的部分,这让我和 xpath 查找都很困惑...
所以我处理这个的代码变成了:
order_number = order_products.find_element_by_xpath("//tr[@class='title even']");
order_number = order_number.text
order_number = order_number.replace('Order number ', '')
print '\nOrder number [' + order_number + ']'
这段代码将“订单号”中的数字分离出来...
1 个回答
根据新的信息,我会做一些大胆的猜测,开始一个答案,等我们了解更多后再进行改进。
首先,看起来你没有使用lxml这个库。我写了一个在lxml下能工作的解决方案,如果你能切换到lxml来处理解析和xpath的需求,你就可以直接使用这个方案。如果不能的话,能否告诉我你为什么不使用lxml呢?
其次,错误信息表明这个元素不存在。你确定在你读取的文档中有一个类名为'title'的tr元素吗?试着用一个你确定包含所需html的测试文件来运行你的代码。我会提供一些可以工作的示例html。
如我所承诺的,下面是一个使用lxml.html来解析示例文件并提取订单号的例子。如果有特别的原因导致这个方法不适用,请在评论中提供相关信息,我会为你调整这个例子。如果你实在不能切换到lxml,我们需要更多的信息,正如评论中所请求的那样。请根据需要编辑你最初的问题(下面有一个小编辑按钮)。
test.py
import lxml.html
data = lxml.html.parse('test.html')
orders = data.xpath('//tr[@class="title"]/td')
for order in orders:
print('Order text: ' + order.text)
print('Parsed order number: ' + order.text.split(' ')[-1])
test.html
<html>
<head><title>Test</title></head>
<body>
Blah blah
<div>Ignore me</div>
<div>Outer stuff
<table border="1">
<tr><td>bogus stuff we don't care about</td></tr>
<tr class='title'><td color='grey'>Order Number 6097279</td></tr>
<tr class='something_else'><td>Boring stuff</td></tr>
</table>
</div>
</body>
</html>
Output
Order text: Order Number 6097279
Parsed order number: 6097279