在 python 3.6 中 - 使用 xpath 获取文本

  in python 3.6 - getting text using xpath

<div class = "card-block cms>
<p>and then have a tea or coffee on the balcony of the cafeteria.</p>
<p>&nbsp;</p>
</div>

我正在尝试检查我抓取的网站文本是否包含

texts = driver.find_element_by_xpath("//div[@class='card-block cms']")
textInDivTag = texts.text
print(textInDivTag)
if u"\xa0" in textInDivTag:
    print("yes")

我的输出如下:

and then have a tea or coffee on the balcony of the cafeteria.

如您所见,它无法识别不间断 space。

该字符已被识别,但正在转换为正常 space (u"\x20")。

根据 comment in the java selenium sourcecode, .text / .getText() returns the visible text, and references the w3c webdriver specification,“11.3.5 获取元素文本”部分(重点由我添加):

The Get Element Text command intends to return an element’s text “as rendered”. An element’s rendered text is also used for locating a elements by their link text and partial link text.

One of the major inputs to this specification was the open source Selenium project. This was in wide-spread use before this specification written, and so had set user expectations of how the Get Element Text command should work. As such, the approach presented here is known to be flawed, but provides the best compatibility with existing users.

很可能,这种行为符合规范,但我还找不到专门用常规白色 space 替换不间断 spaces 的源代码。我在 selenium 存储库中也找不到问题,但也许您可以打开一个来尝试一下。

匹配u"\xa0"使用

textInDivTag = texts.get_attribute('innerText')

匹配u"\x20"使用

textInDivTag = texts.text

不间断Space (&nbsp;)

不间断的 space 即 &nbsp; 是不会换行的 space。由不间断 space 分隔的两个单词会粘在一起(不会换行)。当打破单词可能会造成破坏时,这很方便。示例:

  • § 10
  • 10 km/h
  • 晚上 10 点

不间断 space 的另一个常见用途是防止浏览器截断 HTML 页面中的 spaces。如果您在文本中写了 10 个 space,浏览器将删除其中的 9 个。要向您的文本添加真正的 space,您可以使用 &nbsp; 字符实体。


Element.innerHTML

  • 语法:

    const content = element.innerHTML;
    element.innerHTML = htmlString;
    
  • 值:Element.innerHTML 是一个包含元素后代的 HTML 序列化的 DOMString。设置 innerHTML 的值会删除元素的所有后代,并用通过解析字符串 htmlString.

  • 中给出的 HTML 构造的节点替换它们
  • 注意:如果<div><span><noembed>节点的子文本节点包含字符 (&), (<), or (>), innerHTML returns 这些字符作为 HTML 个实体 &amp;&lt;&gt; 分别。使用 Node.textContent 获取这些文本节点内容的原始副本。


Node.innerText

Node.innerText 是一个 属性 表示节点及其后代的 rendered 文本内容。作为 getter,它近似于用户使用光标突出显示元素的内容然后复制到剪贴板时将获得的文本。


Node.textContent

Node.textContent 属性表示节点及其后代的文本内容。

  • 语法:

    var text = element.textContent;
    element.textContent = "this is some sample text";
    
  • 描述:

  • textContent returns null 如果节点是文档、DOCTYPE 或符号。要获取整个文档的所有文本和 CDATA 数据,可以使用 document.documentElement.textContent.
  • 如果节点是 CDATA 部分、注释、处理指令或文本节点,textContent returns 此节点内的文本(节点值)。
  • 对于其他节点类型,textContent returns 每个子节点的 textContent 的串联,不包括注释和处理指令。如果节点没有子节点,则这是一个空字符串。

这个用例

因为你的用例是检查网站是否包含 &nbsp; 你必须使用 textContent 属性如下:

texts = driver.find_element_by_xpath("//div[@class='card-block cms']")
textInDivTag = texts.extContent
print(textInDivTag)