Python中的find_element_by_xpath

2 投票
1 回答
9810 浏览
提问于 2025-04-17 12:52

我在找网页上那部分内容:

<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 个回答

2

根据新的信息,我会做一些大胆的猜测,开始一个答案,等我们了解更多后再进行改进。

首先,看起来你没有使用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

撰写回答