Selenium Python:查找href属性包含特定关键词的元素

1 投票
1 回答
3247 浏览
提问于 2025-04-18 11:02

我正在处理的页面在这个链接上。

这是该页面相关的部分:

<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

但是搜索页面上可能会有很多结果,所以我想点击那个链接,它的URL里包含我正在搜索的产品编号(在这个例子中是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

这个问题可能是因为在重建表格时,有些元素被插入到了源代码查看器或检查器中。通常情况下,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')]

撰写回答