Selenium/Python:Find<label for=>没有其他属性的元素

2024-05-14 05:51:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我要恢复下表中的号码: 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>

我想这种奇怪的格式是因为表条目是可选的。我使用驱动程序进入表,通过css选择器(“table.table.table hover”)查找元素,我看到如何轻松地遍历<tr>标记。但是,如何找到第二个保存数据的<td>,在<tr><label for="Rooms">;中? 有没有比“找到只有一个数字的td字段”或加载详细信息页更优雅的方法?

This similar question没有帮到我,因为那里有一个id

编辑:

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


Tags: the方法fortablesite选择器条目label
3条回答

你试过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'

要获取“rooms”的所有元素,只需使用部分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元素分配给变量,然后处理行中的所有数据,因为您知道单元格结构(如果您想处理标签和数据)。

您可以使用driver.find_element_by_xpath()选择适当的td标记。应该使用的XPath表达式如下:

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

这将选择属性等于Roomsfor标记,然后导航到其父元素td,然后导航到以下元素td

所以你的密码是:

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

XPath表达式的一个实际例子是here

相关问题 更多 >