Selenium Python:查找其href属性需要关键字的元素

时间:2014-06-25 14:18:46

标签: python selenium xpath

我正在处理的网页位于 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&amp;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&amp;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

任何帮助将不胜感激!

1 个答案:

答案 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')]