使用Selenium的文本和innerHTML之间的区别

Viv*_*san 5 python selenium attributes properties web-scraping

获取textinnerHTML使用硒之间有什么区别?即使我们在特定元素下有文本,执行时我们也会.text得到空值。但是做的.get_attribute("innerHTML")很好。

有人可以指出两者之间的区别吗?什么时候应该在上面使用'.get_attribute(“ innerHTML”)' .text

Deb*_*anB 11

首先,text是一个属性,而 asinnerHTML是一个属性从根本上来说,属性属性之间存在一些差异。

\n
\n

获取属性(“innerHTML”)

\n

get_attribute(innerHTML)获取innerHTML元素的属性。

\n

此方法将首先尝试返回具有给定名称的属性的值。attribute如果具有该名称的属性不存在,则返回具有相同名称的值。如果没有\xe2\x80\x99sattribute具有该名称,None则返回。

\n

被视为真实的值(即 equalstruefalse)以布尔值形式返回。所有其他非None值都作为字符串返回。对于不存在的属性或特性,None返回。

\n\n
\n

文本

\n

text获取元素的文本。

\n\n

听起来还是很相似吗?参见下文...

\n
\n

属性和属性

\n

当浏览器加载页面时,它会解析HTML 并从中生成 DOM 对象。对于元素节点,大多数标准 HTML 属性会自动成为 DOM 对象的属性。

\n

例如,如果标签是:

\n
<body id="page">\n
Run Code Online (Sandbox Code Playgroud)\n

那么 DOM 对象就有body.id="page".

\n
\n

注意:属性-属性映射不是一对一的!

\n
\n
\n

HTML 属性

\n

在 HTML 中,标签可能具有属性。当浏览器解析 HTML 来为标签创建 DOM 对象时,它会识别标准属性并从中创建 DOM 属性。

\n

因此,当元素具有 id 或其他标准属性时,就会创建相应的属性。但如果属性是非标准的,则不会\xe2\x80\x99 发生。

\n
\n

注意:一个元素的标准属性对于另一个元素可能是未知的。例如,type是标签的标准属性<input>,但不是<body>标签的标准属性。标准属性在相应元素类的规范中进行了描述。

\n
\n

因此,如果一个属性是非标准的,则它不会有 DOM 属性。在这种情况下,可以使用以下方法访问所有属性:

\n
    \n
  • elem.hasAttribute(name): 检查是否存在。
  • \n
  • elem.getAttribute(name): 获取值。
  • \n
  • elem.setAttribute(name, value): 设置值。
  • \n
  • elem.removeAttribute(name): 删除该属性。
  • \n
\n

读取非标准属性的示例:

\n
<body something="non-standard">\n  <script>\n    alert(document.body.getAttribute(\'something\')); // non-standard\n  </script>\n</body>\n
Run Code Online (Sandbox Code Playgroud)\n
\n

属性-属性同步

\n

当标准属性更改时,相应的属性会自动更新,并且(有一些例外)反之亦然。但也有一些例外,例如input.value仅从attribute-> 同步到property,但不同步回来。这个功能实际上是派上用场的,因为用户可能会修改值,然后在修改之后,如果我们想从 HTML 中恢复“原始”值,则属性中的\xe2\x80\x99s。

\n
\n

根据Python中的属性和属性,当我们用类似的东西引用对象的属性时someObject.someAttrPython使用几种特殊的方法来获取someAttr对象的属性。在最简单的情况下,属性只是实例变量

\n

Python 属性

\n

从更广阔的角度来看:

\n
    \n
  • 属性是出现在对象名称之后的名称。这就是句法结构。例如,someObj.name
  • \n
  • __dict__实例变量是对象内部的一项。
  • \n
  • 属性引用的默认语义是提供对实例变量的访问。当我们提到时someObj.name,默认行为实际上是someObj.__dict__[\'name\']
  • \n
\n

Python 属性

\n

在 Python 中,我们可以使用内置函数或装饰器将getter, setter(和) 函数与属性名称绑定。当我们这样做时,对属性的每个引用都具有直接访问实例变量的语法,但它调用给定的方法函数。deleterproperty()@property

\n


Bua*_*ban 5

例如,<div><span>Example Text</span></div>

.get_attribute("innerHTML")为您提供当前元素内的实际 HTML。所以theDivElement.get_attribute("innerHTML")返回“ <span>Example Text</span>”。

.text仅提供文本,不包括 HTML 节点。所以theDivElement.text返回“ Example Text”。

请注意,算法.text取决于每个浏览器的网络驱动程序。在某些情况下,例如element is hide,当您使用不同的网络驱动程序时,您可能会得到不同的文本。

.get_attribute("innerText")我通常从而不是获取文本.text,因此我可以处理所有情况。


小智 5

.text 将检索视口中不存在的文本的空字符串,因此您可以将对象滚动到视口中并尝试 .text。它应该检索该值。

相反,innerhtml可以获取该值,即使它存在于视口之外。