Selenium/Python: 查找没有其他属性的 <label for=""> 元素
Selenium/Python: Find <label for=""> element with no other attributes
我想恢复位于以下 table 中的号码:
the site
<table class="table table-hover table-inx">
<tbody><tr>
</tr>
<tr>
</tr>
<tr>
</tr>
<tr>
<td class=""><label for="RentNet">Miete (netto)</label></td>
<td>478,28 €</td>
</tr>
<tr>
</tr>
<tr>
</tr>
<tr>
<td class=""><label for="Rooms">Zimmer</label></td>
<td>4</td>
</tr>
</tbody></table>
我想之所以会出现这种奇怪的格式,是因为 table 条目是可选的。我使用 driver.find_element_by_css_selector("table.table.table-hover") 到达 table,我看到了如何轻松地遍历 <tr>
标签。但是我如何找到第二个 <td>
保存数据,在 <tr>
和 <label for="Rooms"
> ?
有没有比"find the only td field with a one-digit number"或者加载详情页更优雅的方式?
This similar question 没有帮助我,因为有问题的标签有一个 id
编辑:
我刚刚在相关问题的回答中发现 very helpful cheat sheet for Xpath/CSS 选择器:它包含引用 child/parent、下一个 table 条目的方法等等
您可以使用 driver.find_element_by_xpath()
select 适当的 td
标签。您应该使用的 XPath
表达式如下:
`'//label[@for="Rooms"]/parent::td/following-sibling::td'`
此 select 是具有 for
属性等于 Rooms
的 label
标记,然后导航到其父 td
元素,然后导航到以下 td
个元素。
因此您的代码将是:
elem = driver.find_element_by_xpath(
'//label[@for="Rooms"]/parent::td/following-sibling::td')
XPath 表达式的一个例子是 here.
你试过 xpath 了吗? Firebug 是复制 xpath 的好工具。它将使用 select 您想要的元素的索引。当您的元素没有名称或 ID 时,它特别有用。
编辑:不确定为什么我被否决了?我访问该站点,发现 XPath Firebug 给我:
/html/body/div[2]/div[7]/div[2]/div[3]/div/div[1]/div/div[3]/div[3]/div/table/tbody/tr[7]/td[2]
要获得 4,只需:
xpath = "/html/body/div[2]/div[7]/div[2]/div[3]/div/div[1]/div/div[3]/div[3]/div/table/tbody/tr[7]/td[2]"
elem = driver.find_element_by_xpath(xpath)
print elem.text # prints '4'
要获取 "rooms" 的所有元素,您只需 driver.find_elements_by_xpath 使用部分 xpath,就像这样:
xpath = "/div/div[1]/div/div[3]/div[3]/div/table/tbody/tr[7]/td[2]"
elems = driver.find_elements_by_xpath(xpath) # returns list
for elem in elems:
print elem.text # prints '3', '3', '4'
最后,您也许可以通过页面源获取数据。
首先,让我们创建一个函数,在输入页面源时输出房间列表:
def get_rooms(html):
rooms = list()
partials = html.split('''<label for="Rooms">''')[1:]
for partial in partials:
partial = partial.split("<td>")[1]
room = partial.split("</td>")[0]
rooms.append(room)
return rooms
定义该函数后,我们可以通过以下方式检索房间号列表:
html = driver.page_source
print get_rooms(html)
它应该输出:
["3", "3", "4"]
使用 xpath,您可以创建对包含另一个元素的元素的搜索,如下所示:
elem = driver.find_element_by_xpath('//tr[./td/label[@for="Rooms"]]/td[2]')
elem
变量现在将保存 "Rooms" 标签行中的第二个 td 元素(这正是您要查找的内容)。您还可以将 tr 元素分配给变量,然后处理行中的所有数据,因为您知道单元格结构(如果您想处理标签和数据)。
我想恢复位于以下 table 中的号码: the site
<table class="table table-hover table-inx">
<tbody><tr>
</tr>
<tr>
</tr>
<tr>
</tr>
<tr>
<td class=""><label for="RentNet">Miete (netto)</label></td>
<td>478,28 €</td>
</tr>
<tr>
</tr>
<tr>
</tr>
<tr>
<td class=""><label for="Rooms">Zimmer</label></td>
<td>4</td>
</tr>
</tbody></table>
我想之所以会出现这种奇怪的格式,是因为 table 条目是可选的。我使用 driver.find_element_by_css_selector("table.table.table-hover") 到达 table,我看到了如何轻松地遍历 <tr>
标签。但是我如何找到第二个 <td>
保存数据,在 <tr>
和 <label for="Rooms"
> ?
有没有比"find the only td field with a one-digit number"或者加载详情页更优雅的方式?
This similar question 没有帮助我,因为有问题的标签有一个 id
编辑:
我刚刚在相关问题的回答中发现 very helpful cheat sheet for Xpath/CSS 选择器:它包含引用 child/parent、下一个 table 条目的方法等等
您可以使用 driver.find_element_by_xpath()
select 适当的 td
标签。您应该使用的 XPath
表达式如下:
`'//label[@for="Rooms"]/parent::td/following-sibling::td'`
此 select 是具有 for
属性等于 Rooms
的 label
标记,然后导航到其父 td
元素,然后导航到以下 td
个元素。
因此您的代码将是:
elem = driver.find_element_by_xpath(
'//label[@for="Rooms"]/parent::td/following-sibling::td')
XPath 表达式的一个例子是 here.
你试过 xpath 了吗? Firebug 是复制 xpath 的好工具。它将使用 select 您想要的元素的索引。当您的元素没有名称或 ID 时,它特别有用。
编辑:不确定为什么我被否决了?我访问该站点,发现 XPath Firebug 给我:
/html/body/div[2]/div[7]/div[2]/div[3]/div/div[1]/div/div[3]/div[3]/div/table/tbody/tr[7]/td[2]
要获得 4,只需:
xpath = "/html/body/div[2]/div[7]/div[2]/div[3]/div/div[1]/div/div[3]/div[3]/div/table/tbody/tr[7]/td[2]"
elem = driver.find_element_by_xpath(xpath)
print elem.text # prints '4'
要获取 "rooms" 的所有元素,您只需 driver.find_elements_by_xpath 使用部分 xpath,就像这样:
xpath = "/div/div[1]/div/div[3]/div[3]/div/table/tbody/tr[7]/td[2]"
elems = driver.find_elements_by_xpath(xpath) # returns list
for elem in elems:
print elem.text # prints '3', '3', '4'
最后,您也许可以通过页面源获取数据。 首先,让我们创建一个函数,在输入页面源时输出房间列表:
def get_rooms(html):
rooms = list()
partials = html.split('''<label for="Rooms">''')[1:]
for partial in partials:
partial = partial.split("<td>")[1]
room = partial.split("</td>")[0]
rooms.append(room)
return rooms
定义该函数后,我们可以通过以下方式检索房间号列表:
html = driver.page_source
print get_rooms(html)
它应该输出:
["3", "3", "4"]
使用 xpath,您可以创建对包含另一个元素的元素的搜索,如下所示:
elem = driver.find_element_by_xpath('//tr[./td/label[@for="Rooms"]]/td[2]')
elem
变量现在将保存 "Rooms" 标签行中的第二个 td 元素(这正是您要查找的内容)。您还可以将 tr 元素分配给变量,然后处理行中的所有数据,因为您知道单元格结构(如果您想处理标签和数据)。