我试图用 Selenium 来锻炼,我尝试了这个:
phone = driver.find_element_by_xpath(("//table[@class='contact_info_table']/tbody/tr/td[contains(text(), r'\+[0-9]*']"))
为了尝试获取表中的电话号码。该表的 HTML 如下:
<table class="contact_info_table">
<tbody>
<tr>
<th>......</th>
<td>
. . .
</td>
</tr>
<tr>
<th>......</th>
<td>
. . .
</td>
</tr>
<tr>
<th>Telefono:</th>
<td><img style="vertical-align:middle; display: inline-block; margin-right: 10px;" src="../img/flags/it.png" title="Italia">+1234567890</td>
</tr>
我需要做的是获取最后一个tr中的1234567。我做错了什么?
我得到的错误是:
InvalidSelectorException: Message: Given xpath expression "//table[@class='contact_info_table']/tbody/tr/td[contains(text(), r'\+[0-9]*']]" is invalid: SyntaxError: The expression is not a legal expression.
谢谢。
最佳答案
看起来您在路径的一部分中错过了括号 - 在正则表达式之后,您有两个结束 ]]
,但您需要一个 )
来替换倒数第二个 ]
以关闭 contains
查询:
//table[@class='contact_info_table']/tbody/tr/td[contains(text(), r'\+[0-9]*')]
我也不确定您使用的正则表达式是否是 XPath 的有效语法。我认为您需要在 XPath 中使用 matches()
方法 - 像这样:
/td[matches(text(), '\+[0-9]*']]
我用 matches
替换了你的 contains
,并从你的正则表达式中删除了前面的 r
因为我认为你的表达式只需要是 '\+[0-9]*'
。希望这会有所帮助。
您可能根本不需要使用正则表达式来查找您要查找的元素。下面是一个备用 XPath,它不使用正则表达式,但仍然通过获取所需的 td
元素作为前面的 th
的同级元素来定位元素:
//th[text()='Telefono:']//following-sibling::td
因此,要获取电话号码,您可以使用.text
:
phone = driver.find_element_by_xpath("//th[text()='Telefono:']//following-sibling::td").text
关于python selenium 说 xpath 表达式无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58868212/