Reputation: 662
If would like to access the row element from a HTML table where the text in a certain cell matches my string 'Mathematik & Informatik'
.
The HTML looks like this:
<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>
I am using Python and Selenium and came up with the following bit of code to get the table row I want.
driver.find_elements(By.XPATH, "//table//tr/td[contains(text(),'Mathematik & Informatik')]/..")
This line returns a list with three elements. These are the two rows that match my string 'Mathematik & Informatik'
, but also another element that somehow has the text ' Mathematik & Informatik, Weihenstephan 8:00 – 14:3015:00 – 21:30 10:00 – 14:3015:00 – 19:30 '
.
I do not understand what's wrong with my XPATH (why It does not return only the two rows with the given text). Could you help me fix it please?
Thanks for your help!
Upvotes: 0
Views: 1685
Reputation: 29362
I do not agree with the @Prophet solution, since there are trailing spaces and if you do not use .contains
it won't match up any node.
I see only two matching nodes in the HTML that you've shared. However, you can make it tightly coupled with class like this:
//table//tr/td[contains(text(),'Mathematik & Informatik') and @class='views-field views-field-field-teilbibliothek']
also, Selenium does not have support for XPath v2.0, if it had, we'd have ended up using ends-with
.
to remove trailing spaces, please use:
//table//tr/td[normalize-space()='Mathematik & Informatik']/..
You will have to check-in HTMLDOM first that how many nodes it is matching:
Steps to check:
Press F12 in Chrome
-> go to element
section -> do a CTRL + F
-> then paste the xpath
and see, if your desired elements
is getting highlighted with 1/2
matching node.
Upvotes: 1
Reputation: 33361
In case you want to match lines with text equals to some value, not just contains some text (and may contain additional text there) you should use appropriate XPath expression.
So, instead of
driver.find_elements(By.XPATH, "//table//tr/td[contains(text(),'Mathematik & Informatik')]/..")
You can use
driver.find_elements(By.XPATH, "//table//tr/td[text()='Mathematik & Informatik']/..")
BTW, you can also locate the desired tr
element directly, without a need to step up from the td
as following:
driver.find_elements(By.XPATH, "//table//tr[./td[text()='Mathematik & Informatik']]")
Upvotes: 0