Python中的find_element_by_xpath

时间:2012-02-12 05:48:50

标签: python xpath webdriver

我正在搜索网页的部分内容:

<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元素名称不区分大小写。但无论如何我都得到同样的错误。

我得到的回应:

enter image description here

至于没有“接受”答案,我为此道歉 - 部分原因是由于不知道我必须这样做,另一部分是我在没有得到回应时得到通知。

我会回去做更正。

=====================================

编辑以响应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 + ']'

将数字与“订单号”分开......

1 个答案:

答案 0 :(得分:2)

基于这些新信息,我将做一些盲目的猜测,并开始回答我们可以在我们了解更多的基础上进行改进。

首先,您似乎没有使用lxml。我编写了一个在lxml中运行的解决方案,所以如果你能够为解析/ xpath需求切换到lxml,你应该可以直接使用它。如果没有,您可能会提供一些有关您未使用lxml的信息。

其次,错误消息暗示该元素不存在。您确定在您正在阅读的文档中是否存在带有class ='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>

输出

Order text: Order Number 6097279
Parsed order number: 6097279