在Python 3.6中-使用XPath表达式获取文本

bttbmeg0  于 2023-02-26  发布在  Python
关注(0)|答案(3)|浏览(174)
<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")

我的输出如下:
然后在自助餐厅的阳台上喝茶或咖啡。
正如您所看到的,它不识别非中断空格。

byqmnocz

byqmnocz1#

字符被识别,但将被转换为普通空格(u"\x20")。
根据Java Selenium源代码中的注解,.text/.getText()返回可见文本,并引用W3C webdriver规范的“11.3.5获取元素文本”部分(强调部分由我添加):
“获取元素文本“命令用于返回元素的”呈现“文本。元素的呈现文本也用于通过链接文本和部分链接文本定位元素。
本规范的主要输入之一是开源的Selenium项目。在编写本规范之前,Selenium项目已经广泛使用,因此用户对Get Element Text命令的工作方式有了一定的期望。因此,这里介绍的方法虽然有缺陷,但对现有用户提供了最佳的兼容性。
因此,这种行为可能符合规范,但我还没有找到专门将不间断空格替换为常规空格的源代码。我也没有在Selenium存储库中找到问题,但也许您可以打开一个来尝试一下。

ffx8fchx

ffx8fchx2#

要匹配u"\xa0",请使用

textInDivTag = texts.get_attribute('innerText')

要匹配u"\x20",请使用

textInDivTag = texts.text
ubof19bj

ubof19bj3#

不间断空格(&nbsp;

不换行空格(如**&nbsp;**)是不会换行的空格。由不换行空格分隔的两个单词将粘在一起(不会换行)。当单词的换行可能会造成中断时,这很方便。示例:

  • 第十节
  • 10公里/小时
  • 晚上10点

不换行空格的另一个常见用途是防止浏览器截断HTML页中的空格。如果在文本中写入10个空格,浏览器将删除其中的9个。要在文本中添加实际空格,可以使用**&nbsp;**字符实体。

元素.内部HTML

  • 语法:
const content = element.innerHTML;
element.innerHTML = htmlString;
  • 值:**Element.innerHTML**是包含元素后代的HTML序列化的DOMString。设置innerHTML的值将删除元素的所有后代,并将其替换为通过分析字符串htmlString中给定的HTML而构造的节点。
      • 注**:如果<div><span><noembed>节点具有包含字符的子文本节点(x 1m 7 n 1x),(<),或(>),innerHTML将这些字符作为HTML实体返回**&amp;,* * &lt;&gt;。使用Node. textContent获取这些文本节点内容的原始副本。

节点内部文本

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

节点. text内容

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

  • 语法:
var text = element.textContent;
element.textContent = "this is some sample text";
  • 描述:
  • 如果节点是文档、DOCTYPE或注解,则textContent返回null。要获取整个文档的所有文本和CDATA数据,可以使用document.documentElement.textContent
  • 如果节点是CDATA节、注解、处理指令或文本节点,则textContent返回此节点内的文本(nodeValue)。
  • 对于其他节点类型,textContent返回每个子节点的textContent的串联,不包括注解和处理指令。如果节点没有子节点,则这是空字符串。

此用例

由于您的用例是检查网站是否包含**&nbsp;,因此必须按如下方式使用textContent**属性:

texts = driver.find_element_by_xpath("//div[@class='card-block cms']")
for my_text in texts:
    textInDivTag = texts.textContent
    print(textInDivTag)

相关问题