python selenium表示xpath表达式无效

python selenium表示xpath表达式无效,python,selenium,xpath,Python,Selenium,Xpath,我试着用硒进行锻炼,我试过这样做: 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> <

我试着用硒进行锻炼,我试过这样做:

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>

谢谢。

看起来您在路径的一部分中遗漏了一个括号--在正则表达式之后,您有两个关闭的
]
,但是您需要一个
来替换倒数第二个
]
,以便关闭
包含的
查询:

//table[@class='contact_info_table']/tbody/tr/td[contains(text(), r'\+[0-9]*')]
我也不确定您使用的正则表达式是否是XPath的有效语法。我认为您需要在XPath中使用
matches()
方法——如下所示:

/td[matches(text(), '\+[0-9]*']]
我将您的
contains
替换为
matches
,并从正则表达式中删除前面的
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

看起来您在路径的一部分遗漏了一个括号——在正则表达式之后,有两个括号正在关闭
]
,但是您需要一个
来替换倒数第二个
]
,以便关闭
包含的
查询:

//table[@class='contact_info_table']/tbody/tr/td[contains(text(), r'\+[0-9]*')]
我也不确定您使用的正则表达式是否是XPath的有效语法。我认为您需要在XPath中使用
matches()
方法——如下所示:

/td[matches(text(), '\+[0-9]*']]
我将您的
contains
替换为
matches
,并从正则表达式中删除前面的
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

下面是您可以使用的xpath

//table[@class='contact_info_table']/tbody/tr[th[.='Telefono:']]/td

以下是您可以使用的xpath

//table[@class='contact_info_table']/tbody/tr[th[.='Telefono:']]/td

您是否尝试过
//table[@class='contact\u info\u table']/tbody/tr[th[.='Telefono:']]/td
xpath。您是否尝试过
//table[@class='contact\u info\u table']/tbody/tr[th[.='Telefono:']]/td
xpath。非常感谢@Christine现在它不再给我错误了,但我不知道为什么,当我尝试打印phone的值时,它不会打印任何内容。另一个变量也是如此,它是div中span中包含的name和ins。这是代码:
name=driver。通过xpath((“//div[@class='head info']/span”))查找元素。text print('name:')print(name)phone=driver。通过xpath(//th[text()='Telefono:']//following sibling::td)查找元素。text print(“phone:”)print(phone)
输出为:
Name:Phone:
该代码看起来是正确的-如果XPath错误,您将遇到NoTouchElementException,因此似乎找到了web元素。您能否从两个元素中删除
.text
(因此您只是打印实际的web元素引用)以验证是否确实找到了某些内容?这是故障排除的第一步。再次感谢您的支持。我已经这样做了,它似乎已经找到了元素,所以我不明白它为什么不打印文本。这是输出:
Name:Phone:
Yes,这些确实是打印出来的有效web元素。我最好的猜测是,不知何故找到了错误的元素——可能XPath查询实际上是在查找多个元素,而第一个返回并打印出来的元素是不正确的。您可以尝试使用
//table[@class='contact\u info\u table']/tbody/tr/th[text()='Telefono:']/following sibling::td
(比我文章中的路径更具体),看看这是否有帮助。我们可能需要查看整页的源代码来了解这里到底发生了什么。将
find_element_by_xpath
更改为
find_elements_by_xpath
,然后
print(len(phone))
将有助于告诉我们xpath是否定位了多个元素。非常感谢@Christine现在它不再给我错误了,但我不知道为什么,当我尝试打印phone的值时,它不会打印任何内容。另一个变量也是如此,它是div中span中包含的name和ins。这是代码:
name=driver。通过xpath((“//div[@class='head info']/span”))查找元素。text print('name:')print(name)phone=driver。通过xpath(//th[text()='Telefono:']//following sibling::td)查找元素。text print(“phone:”)print(phone)
输出为:
Name:Phone:
该代码看起来是正确的-如果XPath错误,您将遇到NoTouchElementException,因此似乎找到了web元素。您能否从两个元素中删除
.text
(因此您只是打印实际的web元素引用)以验证是否确实找到了某些内容?这是故障排除的第一步。再次感谢您的支持。我已经这样做了,它似乎已经找到了元素,所以我不明白它为什么不打印文本。这是输出:
Name:Phone:
Yes,这些确实是打印出来的有效web元素。我最好的猜测是,不知何故找到了错误的元素——可能XPath查询实际上是在查找多个元素,而第一个返回并打印出来的元素是不正确的。您可以尝试使用
//table[@class='contact\u info\u table']/tbody/tr/th[text()='Telefono:']/following sibling::td
(比我文章中的路径更具体),看看这是否有帮助。我们可能需要查看整个页面的源代码,以了解这里到底发生了什么