我正在处理的网页位于 this link 。
这是该页面的相关部分:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>...</head>
<body>
...
<div id="searchResults">
<div class="box-related">...</div>
<a href='downloadDataServlet?category=true&type=epar' onclick=""><img src="/ema/images/icon_download_spread.gif" />Download results to spreadsheet</a>
<div class="table-holder">
<table class="table-epar eparResults" border="1" cellpadding="0" cellspacing="0" summary="Search results for EPARs ordered alphabetically">
<caption>EPAR Search results</caption>
<thead> ... </thead>
<tbody>
<tr>
<th scope="row" class="key-detail name word-wrap">
<a href="index.jsp?curl=pages/medicines/human/medicines/000471/human_med_000619.jsp&mid=WC0b01ac058001d124">Abilify</a>
</th>
...
</tr>
<tr>...</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>
这是我想要选择的元素的XPath位置:
//*[@id="searchResults"]/div[2]/table/tbody/tr[1]/th/a
但搜索页面上可能会有很多结果,因此我想点击其网址中包含我正在搜索的产品编号的链接(在这种情况下为000471
)。我想在<a>
属性中选择包含该字符串的href
元素。
这是我尝试过的:
inp = driver.find_element_by_xpath("//*[@id='searchResults']/div[2]/table/tbody/tr[1]/th/a[contains(@href,'"+str3+"')]")
inp.click()
其中str3
在这种情况下的值为000471
。但我一直在NoSuchElementException
。
任何帮助将不胜感激!
答案 0 :(得分:0)
问题可能是由重建表时插入源代码查看器或检查器的元素引起的。 tbody
标记通常会在代码中插入,但它实际上并不存在于真实来源中。
如果您仍然可以获得要选择的数据的唯一位置路径,则可以消除XPath中不必要的步骤。这可能就足够了:
//*[@id='searchResults']//a[contains(@href,'000471')]
如果仍然需要其他步骤,您可以在不使用 tbody
的情况下尝试。
更新我还注意到您的搜索页面声明了一个命名空间:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
...
默认名称空间的自动注册取决于实现。 XPath要求所有选择器都使用命名空间进行限定。如果您的selenium实现不这样做,您需要注册名称空间/前缀映射,并在名称空间中添加所有元素(例如://h:table/h:tr/h:td
)或忽略命名空间,使用通配符并比较谓词中的本地名称。
如果命名空间阻止您选择节点,则可以使用以下表达式忽略它:
//*[@id='searchResults']//*[local-name() = 'a'][contains(@href,'000471')]