首页 > 解决方案 > Python Selenium 从父级拉取子级属性?

问题描述

我正在尝试为特定字段中的文本抓取 Web 表单,但是我无法使用 xpath 执行此操作,因为某些表单缺少在加载时不会包含在页面中的字段(即,如果 /html/blah/blah/ p[3] 是一个表单的首字母字段,它可能是另一个表单上的名字,但具有相同的 xpath。字段的结构是这样的:

<p><strong>Initials:</strong> WT</p>

因此,我正在使用 python selenium driver.find_element_by_xpath("//*[contains(text(), 'Initials:')]")成功地在强标签之间拉出“首字母:”文本,但我特别需要它后面的子文本,在这种情况下是 WT。它具有包含 WT 值的属性“nextSibling.data”,但从我的谷歌搜索来看,我认为不可能用 python selenium 提取该属性。有谁知道在 xpath 查询之后提取 WT 文本的方法?

标签: pythonseleniumweb-scraping

解决方案


'WT' 文本位于一个奇怪的位置。我不认为它实际上是一个兄弟姐妹本身。我知道抓取该文本的唯一方法是使用p_element.get_attribute('outerHTML'),在这种情况下应该抓取字符串'<p><strong>Initials:</strong> WT</p>'。我怀疑这是最干净的解决方案,但这是一种解析文本的方法:

strong_close_tag = '</strong>'
p_close_tag = '</p>'

p_element = driver.find_element_by_xpath("//*[contains(text(), 'Initials:')]/parent")

print(p_element.get_attribute('outerHTML')[text.index(strong_close_tag)+len(strong_close_tag):text.index(p_close_tag)])

或 -使用p_element.get_attribute('innerHTML'),它应该只返回<strong>Initials:</strong> WT. 然后,类似地,抓取</strong>关闭标签后的文本,可能是这样的:

p_element = driver.find_element_by_xpath("//*[contains(text(), 'Initials:')]/parent")

print p_element.get_attribute('innerHTML').split("</strong>",1)[1] 

推荐阅读