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"))
使用以下代码:
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"))