使用 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 & 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 & 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
匹配节点。
如果想从 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 & 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 & 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
匹配节点。