使用Selenium在text和innerHTML之间的区别

时间:2016-11-04 05:46:05

标签: python selenium web-scraping properties attributes

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

有人可以指出两者之间的区别吗?有人应该使用' .get_attribute(" innerHTML")'超过.text

5 个答案:

答案 0 :(得分:3)

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

.get_attribute("innerHTML")为您提供当前元素中的实际HTML。因此,theDivElement.get_attribute("innerHTML")会返回&#34; <span>Example Text</span>&#34;

.text仅为您提供文字,不包含HTML节点。因此,theDivElement.text会返回&#34; Example Text&#34;

请注意,.text算法取决于每个浏览器的webdriver 。在某些情况下,例如元素被隐藏,当您使用不同的webdriver时,您可能会得到不同的文本。

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

答案 1 :(得分:3)

Chrome(我不确定其他浏览器)会忽略HTML代码中的多余空格,并显示为单个空格。

<div><span>Example  Text</span></div> # notice the two spaces

.get_attribute('innerHTML')将返回双倍行距文本,这是您检查元素时看到的文本),而.text将返回仅具有1个空格的字符串。

>>> print(element.get_attribute('innerHTML'))
'Example  Text'
>>> print(element.text)
'Example Text'

这种差异并非微不足道,因为以下内容会导致NoSuchElementException。

>>> arg = '//div[contains(text(),"Example Text")]'    
>>> driver.find_element_by_xpath(arg)

类似地,以下内容的.get_attribute('innerHTML')返回Example&nbsp;Text,而.text返回Example Text

<div><span>Example&nbsp;Text</span></div>

答案 2 :(得分:2)

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

相反,innerhtml可以获得即使它出现在视口外的值

答案 3 :(得分:1)

我刚刚选择了css选择器并使用了以下代码:

from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.costco.com/Weatherproof%C2%AE-Men's-Ultra-Tech-Jacket.product.100106552.html")
print driver.find_element_by_css_selector(".product-h1-container.visible-xl-block>h1").text

并打印:

Weatherproof® Men's Ultra Tech Jacket

问题是chrome或firefox上的h1[itemprop='name']选择器正在返回2个匹配的节点,而.product-h1-container.visible-xl-block>h1只返回一个匹配的节点,这就是为什么它会让人满意的是

要证明我的观点低于代码:

from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.costco.com/Weatherproof%C2%AE-Men's-Ultra-Tech-Jacket.product.100106552.html")
x= driver.find_elements_by_css_selector("h1[itemprop='name'] ")

for i in x:
    print "This is line " , i.text

会打印

This is line  
This is line  Weatherproof® Men's Ultra Tech Jacket

因为select_element_by_css_selector选择具有匹配选择器且不包含任何文本的第一个元素,所以它不会打印。希望你现在明白了

答案 4 :(得分:1)

首先,text属性,其中innerHTML属性。从根本上说,属性属性之间存在一些差异。


get_attribute(“ innerHTML”)

get_attribute(innerHTML)获取元素的innerHTML

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

被认为是真实的值,等于truefalse,以布尔值形式返回。所有其他非None值都作为字符串返回。对于不存在的属性,返回None

  • Args:

    innerHTML - Name of the attribute/property to retrieve.
    
  • 示例:

    # Extract the text of an element.
    my_text = target_element.get_attribute("innerHTML") 
    

文本

text获取元素的文本。

  • 定义:

    def text(self):
    """The text of the element."""
    return self._execute(Command.GET_ELEMENT_TEXT)['value']
    
  • 示例:

    # Extract the text of an element.
    my_text = target_element.text   
    

听起来还是差不多吗?阅读下面的内容...


Attributes and properties

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

例如,如果标记为:

<body id="page">

然后DOM对象具有body.id="page"

  

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


HTML attributes

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

因此,当元素具有id或其他标准属性时,将创建相应的属性。但是,如果该属性为非标准属性,则不会发生这种情况。

  

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

因此,如果属性为非标准属性,则该属性将没有DOM属性。在这种情况下,可以使用以下方法访问所有属性:

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

读取非标准属性的示例:

<body something="non-standard">
  <script>
    alert(document.body.getAttribute('something')); // non-standard
  </script>
</body>

Property-attribute synchronization

当标准属性更改时,相应的属性会自动更新,并且(除某些例外)反之亦然。但是有一些例外,例如input.value仅从attribute->同步到property,而不同步。该功能实际上很方便,因为用户可以修改值,然后在该值之后,如果我们想从HTML中恢复“原始”值,则该值位于属性中。


按照python中的Attributes and Properties,当我们使用someObject.someAttr引用对象的属性时, Python 使用几种特殊方法来获取someAttr属性对象。在最简单的情况下,属性只是实例变量

Python属性

从更广泛的角度来看:

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

Python属性

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