当前位置: 首页 > 知识库问答 >
问题:

Python和Selenium-获取不包括子节点文本的文本

娄利
2023-03-14

使用Python 3。

假设:

<whatever>
  text
  <subchild>
    other
  </subchild>
</whatever>

如果我这样做:

elem=驱动程序。通过xpath(//whatever)查找元素

elem.text包含"文本其他"

如果我这样做:

elem=驱动程序。通过xpath(“//whatever/text()[normalize-space()]”)查找元素

elem不是Webelement。

我如何继续抓取只文本(而不是其他)?

id est:只抓取直接节点中的文本,而不是子节点。

更新:

原始超文本标记语言是:

<div class="border-ashes the-code text-center">
VIVEGRPN
  <span class="cursor"></span>
  <button class="btn btn-ashes zclip" data-clipboard-target=".the-code" data-coupon-code="VklWRUdSUE4=">
  <span class="r">Hen, la.</span>
</div>

共有3个答案

陶鹏
2023-03-14

最近我遇到了类似的问题,selenium总是给我元素中的所有文本,包括跨距。最后我用换行符“\n”拆分了字符串。例如。

all_text = driver.find_element_by_xpath(xpath).text
req_text = str.split(str(all_text ), "\n")[0]
闻人吕恭
2023-03-14

可以从“全部”文本中删除子节点文本

all_text = driver.find_element_by_xpath("//whatever").text
child_text = driver.find_element_by_xpath("//subchild").text

parent_text = all_text.replace(child_text, '')
李和裕
2023-03-14

请记住,@Guy提到的替换方法对许多结构都不起作用。

例如,拥有这种结构:

<div>
    Hello World
    <b>e</b>
</div>

父文本将是Hello World e,子文本将是e,替换将导致Hllo World而不是Hello World

一个安全的解决方案

要以安全的方式获取元素的自身文本,必须迭代节点的子节点,并连接文本节点。因为在纯Selenium中无法做到这一点,所以必须执行JS代码。

OWN_TEXT_SCRIPT = "if(arguments[0].hasChildNodes()){var r='';var C=arguments[0].childNodes;for(var n=0;n<C.length;n++){if(C[n].nodeType==Node.TEXT_NODE){r+=' '+C[n].nodeValue}}return r.trim()}else{return arguments[0].innerText}"
parent_text = driver.execute_script(OWN_TEXT_SCRIPT, elem)

该脚本是这个简单函数的缩小版:

if (arguments[0].hasChildNodes()) {
    var res = '';
    var children = arguments[0].childNodes;
    for (var n = 0; n < children.length; n++) {
        if (children[n].nodeType == Node.TEXT_NODE) {
            res += ' ' + children[n].nodeValue;
        }
    }
    return res.trim()
}
else {
    return arguments[0].innerText
}
 类似资料:
  • 我必须在JavaSelenium应用程序中解析此元素: 我想得到一个包含所有5个孩子的列表,包括文本。当我使用WebElement中的任何选择器(xpath、cssSelector)时,它只返回4个非文本元素。有人知道怎么做吗?我是硒的新手,以前从未使用过。谢谢

  • 首先,我正在为JavaScript创建一个库,但我不能使用jQuery。我试图获取一个HTML元素的文本内容,而不包含其子元素的文本内容。 innerText和textContent属性都没有提供所需的内容,请帮助。

  • 问题内容: This is some text 获得“这是一些”并非易事。例如,返回“ This is some text”: 通常,如何获得特定元素的文本而不包含其子元素的文本? (我在下面提供了一个答案,但是如果有人想出一个不太丑陋的解决方案,它将让问题悬而未决)。 问题答案: 这是一个常规解决方案: 传递给函数的元素可以是从方法中获得的东西(即它可以是一个对象)。 或者,如果您没有jQuer

  • 问题内容: 我有一段这样的HTML: 我有一个与此HTML匹配的WebElement。如何从中仅提取“标题”?方法.getText()返回“ Title \ nAuthor”。 问题答案: 您无法在WebDriver API中执行此操作,而必须在代码中执行。例如: 请注意,结尾的换行符实际上是元素文本的一部分,因此,如果您不想要它,则需要将其删除。

  • 我有以下的html代码,我需要console.log只有航运。尝试了一些方法,但似乎无法奏效。我试着先选择它的孩子,然后打印出它的父母的文本内容-不行...我可以删除它的孩子,打印出剩下的东西,但我做不到。 有什么建议吗? 谢谢你的帮助 我试过这个: 我想得到发货,但我仍然得到图例元素的所有文本内容

  • 你们这些家伙,我有这样一个HTML: 这是将上述所有选项放入列表的代码: 实际上它不起作用。我不知道我错在哪里。请帮帮我。非常感谢。