xpath如何在children的个数不总是相同的情况下获取children的第一层的最后一个值

xpath how to get the last value of first level of children in the case of the number of children is not always the same

使用以下代码:

data = driver.find_elements(By.XPATH, '//div[@class="postInfo desktop"]/span[@class="nameBlock"]')

我得到了以下 html 代码:

<span class="nameBlock">
  <span class="name">Anonymous</span>
  <span class="posteruid id_RDS8pJvL">(ID:
    <span class="hand" title="Highlight posts by this ID" style="background-color: rgb(228, 51, 
    138); color: white;">RDS8pJvL</span>)</span>
  <span title="United States" class="flag flag-us"></span>
</span>

<span class="nameBlock">
  <span class="name">Pierre</span>
  <span class="postertrip">!AYZrMZsavE</span>
  <span class="posteruid id_y5EgihFc">(ID:
    <span class="hand" title="Highlight posts by this ID" 
    style="background-color: rgb(136, 179, 155); color: black;">y5EgihFc</span>)</span>
  <span title="Australia" class="flag flag-au"></span>
</span>

现在我需要获取“国家”=>“美国”和“澳大利亚”。

对于整个数据集(超过 120k 个条目),我正在做:

for i in data:
 country = i.find_element(By.XPATH, './/span[contains(@class,"flag")]').get_attribute('title')

但过了一会儿我得到了空条目,我发现这个国家的 class 完全从“flag something”变成了“bf something”或“cd something”

这就是为什么我决定为每个元素使用最后一个 children:

for i in data:
 country = i.find_element(By.XPATH, './/span[3]').get_attribute('title')

但是,过了一会儿我又遇到了错误,因为有时 <span class="postertrip">BLABLA</span> 弹出,将“国家/地区”位置移动到“span[4]”。

因此,我更改为以下内容:

for i in data:
 country = i.find_element(By.XPATH, './/span[last()]').get_attribute('title')

但这最后一个总是给我第二级child (posteruid child):

 <span class="hand" title="Highlight posts by this ID" 
        style="background-color: rgb(136, 179, 155); color: black;">y5EgihFc</span>)

有一件事我很确定:国家总是child第一级的最后child(span)[=51] =]ren.

所以我没有想法,这就是我问你这个问题的原因。

对于这种特殊情况,您可以在不计算 child 节点的情况下获得标题。只需将 nameBlock 保留为 root 并创建指向 child 的 xpath,其中 class 将具有标题(标志,在本例中)。像这样:

//span[@class='nameBlock']/span[contains(@class,'flag')]

使用以下 xpath 始终识别父项的最后一个子项。

(//span[@class='nameBlock']//span[@title])[last()]

代码块。

for country in driver.find_elements(By.XPATH, "(//span[@class='nameBlock']//span[@title])[last()]"):
    print(country.get_attribute("title"))