我正在搜索网页的部分内容:
<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
并没有什么区别。
为什么这不起作用?我有其他find_element_by_xpath搜索使用'class = phrasing,它们可以工作。
我正在使用的代码:
order_number = order_products.find_element_by_xpath("//TR[@class='title']");
根据我所读到的,xpath元素名称不区分大小写。但无论如何我都得到同样的错误。
我得到的回应:
至于没有“接受”答案,我为此道歉 - 部分原因是由于不知道我必须这样做,另一部分是我在没有得到回应时得到通知。
我会回去做更正。
=====================================
编辑以响应gfortune ...
我使用您在答案中提供的信息更新了您的问题。将来,请在评论中回复或直接编辑您的问题并更新它以包含其他信息。编辑问题是最好的方法。我已经提交了同行评审的编辑,所以很快就会出现。不幸的是,我们仍然缺少相当多的问题背景。 A)你在用什么图书馆? B)更多代码。一条线可能还不够。 C)有关您正在解析的页面的更多信息。理想情况下,一个非常短的测试用例会触发错误。 - gfortune
老实说,“评论”面板中的小字很难读。另外,我没有得到通知已经做出回应......
无论如何,我没有使用lxml - 因为我不明白它是什么。现在我有一个更好的主意,我会研究它是如何工作的,谢谢。
“order_products变量”只是整个html的sub_block - 它是包含我需要使用的hrtml的部分。页面本身有很多链接的子列表和我不需要使用的东西。我把它分开了,因为在搜索我需要的数据时不必担心。
而且我认为我已经发布了对我的代码进行了更正的工作 - 这里又是了。
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 + ']'
将数字与“订单号”分开......
答案 0 :(得分:2)
基于这些新信息,我将做一些盲目的猜测,并开始回答我们可以在我们了解更多的基础上进行改进。
首先,您似乎没有使用lxml。我编写了一个在lxml中运行的解决方案,所以如果你能够为解析/ xpath需求切换到lxml,你应该可以直接使用它。如果没有,您可能会提供一些有关您未使用lxml的信息。
其次,错误消息暗示该元素不存在。您确定在您正在阅读的文档中是否存在带有class ='title'的tr?针对您确定包含所需html的测试文件运行代码。我将提供一些有效的示例HTML。
正如所承诺的,以下是使用lxml.html解析示例文件并提取订单号的示例。如果有特定原因这不起作用,请在评论中发布相关信息,我会为您调整示例。如果你根本无法切换到lxml,我们需要在评论中提供更多信息。请根据需要编辑原始问题(位于其下方的一个小编辑按钮)。
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])
<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>
Order text: Order Number 6097279
Parsed order number: 6097279