Selenium / Python:查找<label for =“”>元素,没有其他属性

时间:2016-03-05 20:16:16

标签: python selenium label

我想恢复位于下表中的数字: 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>

我认为这种奇怪的格式是因为表条目是可选的。我使用 driver.find_element_by_css_selector(“table.table.table-hover”)来到表中,我看到如何轻松地遍历 <tr> 标签。但是如何使用 <td>&gt; < <tr> 找到第二个 <label for="Rooms" 来保存数据< / em>? 是否有比“找到一位数字的唯一td字段”更优雅的方式或加载详细信息页面?

This similar question没有帮助我,因为有问题的标签有id

编辑:

我刚刚在相关问题的答案中发现了关于Xpath / CSS选择器的very helpful cheat sheet:它包含引用子/父,下一个表条目等的方法

3 个答案:

答案 0 :(得分:4)

您可以使用td选择相应的driver.find_element_by_xpath()代码。您应该使用的XPath表达式如下:

`'//label[@for="Rooms"]/parent::td/following-sibling::td'`

这会选择label标记,for属性等于Rooms,然后导航到其父td元素,然后导航到以下td元素

所以你的代码将是:

elem = driver.find_element_by_xpath(
     '//label[@for="Rooms"]/parent::td/following-sibling::td')

XPath表达式的一个示例是 here

答案 1 :(得分:1)

使用xpath,您可以创建搜索包含其他元素的元素,如下所示:

elem = driver.find_element_by_xpath('//tr[./td/label[@for="Rooms"]]/td[2]')

elem变量现在将在“Rooms”标签行中保存第二个td元素(这正是您要查找的内容)。您还可以将tr元素分配给变量,然后使用行中的所有数据,因为您知道单元格结构(如果您想使用标签和数据)。

答案 2 :(得分:0)

你试过xpath吗? Firebug是一个复制xpath的好工具。它将使用索引来选择所需的元素。当您的元素没有名称或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'

要获得&#34; rooms&#34;的所有元素,您只需使用部分xpath driver.find_elements_by_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"]