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 属性等于 Roomslabel 标记,然后导航到其父 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 元素分配给变量,然后处理行中的所有数据,因为您知道单元格结构(如果您想处理标签和数据)。