使用 Python 和 Selenium 查找与单元格中的文本匹配的 table 行

Finding a table row that matches the text in a cell with Python and Selenium

如果想从 HTML table 访问行元素,其中某个单元格中的文本与我的字符串 'Mathematik & Informatik'.

HTML 看起来像这样:

<table class="views-table cols-4">
   <thead>
      <tr>
         <th class="views-field views-field-field-teilbibliothek" scope="col">
            Teilbibliothek          
         </th>
         <th class="views-field views-field-field-tag" scope="col">
            Datum          
         </th>
         <th class="views-field views-field-field-zeitslot" scope="col">
            Zeitraum          
         </th>
         <th class="views-field views-field-views-conditional" scope="col">
         </th>
      </tr>
   </thead>
   <tbody>
      <tr class="odd views-row-first">
         <td class="views-field views-field-field-teilbibliothek">
            Stammgelände          
         </td>
         <td class="views-field views-field-field-tag">
            <span class="date-display-single">Samstag, 22. Januar 2022</span>          
         </td>
         <td class="views-field views-field-field-zeitslot">
            09:00 – 14:30          
         </td>
         <td class="views-field views-field-views-conditional internlink">
            ausgebucht          
         </td>
      </tr>
      <tr class="even">
         <td class="views-field views-field-field-teilbibliothek">
            Stammgelände          
         </td>
         <td class="views-field views-field-field-tag">
            <span class="date-display-single">Samstag, 22. Januar 2022</span>          
         </td>
         <td class="views-field views-field-field-zeitslot">
            15:00 – 21:30          
         </td>
         <td class="views-field views-field-views-conditional internlink">
            ausgebucht          
         </td>
      </tr>
      <tr class="odd">
         <td class="views-field views-field-field-teilbibliothek">
            Mathematik &amp; Informatik          
         </td>
         <td class="views-field views-field-field-tag">
            <span class="date-display-single">Samstag, 22. Januar 2022</span>          
         </td>
         <td class="views-field views-field-field-zeitslot">
            10:00 – 14:30          
         </td>
         <td class="views-field views-field-views-conditional internlink">
            ausgebucht          
         </td>
      </tr>
      <tr class="even">
         <td class="views-field views-field-field-teilbibliothek">
            Mathematik &amp; Informatik          
         </td>
         <td class="views-field views-field-field-tag">
            <span class="date-display-single">Samstag, 22. Januar 2022</span>          
         </td>
         <td class="views-field views-field-field-zeitslot">
            15:00 – 19:30          
         </td>
         <td class="views-field views-field-views-conditional internlink">
            ausgebucht          
         </td>
      </tr>
      <tr class="odd">
         <td class="views-field views-field-field-teilbibliothek">
            Weihenstephan          
         </td>
         <td class="views-field views-field-field-tag">
            <span class="date-display-single">Samstag, 22. Januar 2022</span>          
         </td>
         <td class="views-field views-field-field-zeitslot">
            10:00 – 14:30          
         </td>
         <td class="views-field views-field-views-conditional internlink">
            <a href="/reserve/1438527699">Zur Reservierung</a>          
         </td>
      </tr>
      <tr class="even views-row-last">
         <td class="views-field views-field-field-teilbibliothek">
            Weihenstephan          
         </td>
         <td class="views-field views-field-field-tag">
            <span class="date-display-single">Samstag, 22. Januar 2022</span>          
         </td>
         <td class="views-field views-field-field-zeitslot">
            15:00 – 19:30          
         </td>
         <td class="views-field views-field-views-conditional internlink">
            <a href="/reserve/530262745">Zur Reservierung</a>          
         </td>
      </tr>
   </tbody>
</table>

我正在使用 Python 和 Selenium,并想出了以下代码来获得我想要的 table 行。

driver.find_elements(By.XPATH, "//table//tr/td[contains(text(),'Mathematik & Informatik')]/..")

这一行 return 是一个包含三个元素的列表。这些是匹配我的字符串 'Mathematik & Informatik' 的两行,还有另一个元素以某种方式具有文本 ' Mathematik & Informatik, Weihenstephan  8:00 – 14:3015:00 – 21:30 10:00 – 14:3015:00 – 19:30 '.

我不明白我的 XPATH 有什么问题(为什么它不 return 只有给定文本的两行)。你能帮我解决一下吗?

感谢您的帮助!

如果您想将文本 等于 的行匹配到某个值,而不仅仅是 包含 一些文本(并且可能包含其他文本那里)你应该使用适当的 XPath 表达式。
所以,而不是

driver.find_elements(By.XPATH, "//table//tr/td[contains(text(),'Mathematik & Informatik')]/..")

您可以使用

driver.find_elements(By.XPATH, "//table//tr/td[text()='Mathematik & Informatik']/..")

顺便说一句,您也可以直接定位所需的 tr 元素,无需从 td 开始,如下所示:

driver.find_elements(By.XPATH, "//table//tr[./td[text()='Mathematik & Informatik']]")

我不同意@Prophet 的解决方案,因为有 尾随空格 并且如果您不使用 .contains 它不会匹配任何节点。

我在您共享的 HTML 中只看到两个匹配的节点。但是,您可以像这样使其与 class 紧密耦合:

//table//tr/td[contains(text(),'Mathematik & Informatik') and @class='views-field views-field-field-teilbibliothek']

此外,Selenium 不支持 XPath v2.0,如果支持,我们最终会使用 ends-with

要删除 尾随空格,请使用:

//table//tr/td[normalize-space()='Mathematik & Informatik']/..

你必须先check-inHTMLDOM匹配[=40] =]:

检查步骤:

Press F12 in Chrome -> 转到 element 部分 -> 执行 CTRL + F -> 然后粘贴 xpath 并查看是否需要 elements正在 突出显示 1/2 匹配节点。