当标准属性(Attribute)变更时,Map的属性(Property)会自动更新,而且(有一些例外)反之亦然。但也有例外,例如input.value只同步从attribute-〉到property,而不同步回来。这个特性实际上很方便,因为用户可以修改值,然后在它之后,如果我们想从HTML中恢复“原始”值,它就在属性中。 根据Python中的Attributes and Properties,当我们用someObject.someAttr这样的东西引用对象的属性时,Python 使用几种特殊的方法来获取对象的someAttr属性。在最简单的情况下,属性只是示例变量。
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
5条答案
按热度按时间sycxhyv71#
首先,
text
是一个属性,而innerHTML
是一个属性。“内部HTML”(“innerHTML”)
get_attribute(innerHTML)会取得元素的
innerHTML
。此方法首先尝试返回具有给定名称的属性的值。如果具有该名称的属性不存在,则返回具有相同名称的
attribute
的值。如果不存在具有该名称的attribute
,则返回**None
**。被视为真实值的值(即相等
true
或false
)会以布林值传回。所有其他非None
值会以字串传回。对于不存在的属性(Attribute)或特性(Property),则会传回None
。文本
text获取元素的文本。
听起来还像吗?请阅读以下内容...
Attributes and properties(第一个字母)
当浏览器加载页面时,它解析HTML并从中生成DOM对象。对于元素节点,大多数标准HTML属性自动成为DOM对象的属性。
例如,如果标记为:
则DOM对象具有
body.id="page"
。注意:属性-特性Map不是一对一的!
HTML属性
在HTML中,标签可能具有属性。当浏览器解析HTML以创建标签的DOM对象时,它会识别标准属性并根据它们创建DOM属性。
因此,当一个元素有id或其他标准属性时,就会创建相应的属性,但如果属性是非标准的,就不会发生这种情况。
注:一个元素的标准属性对于另一个元素可能是未知的。例如,
type
是<input>
标记的标准属性,但不是<body>
标记的标准属性。标准属性在相应元素类的规范中进行了说明。因此,如果一个属性是非标准的,它就没有DOM属性。在这种情况下,所有属性都可以通过以下方法访问:
elem.hasAttribute(name)
:检查是否存在。elem.getAttribute(name)
:获取值。elem.setAttribute(name, value)
:设置值。elem.removeAttribute(name)
:移除属性。阅读非标准属性的示例:
属性-属性同步
当标准属性(Attribute)变更时,Map的属性(Property)会自动更新,而且(有一些例外)反之亦然。但也有例外,例如
input.value
只同步从attribute
-〉到property
,而不同步回来。这个特性实际上很方便,因为用户可以修改值,然后在它之后,如果我们想从HTML中恢复“原始”值,它就在属性中。根据Python中的Attributes and Properties,当我们用
someObject.someAttr
这样的东西引用对象的属性时,Python 使用几种特殊的方法来获取对象的someAttr
属性。在最简单的情况下,属性只是示例变量。Python属性
从更广泛的Angular 来看:
someObj.name
。__dict__
中的项目。Python属性
在Python中,我们可以使用内置的
property()
函数或@property
装饰器,将getter
、setter
(和deleter
)函数与属性名绑定在一起。当我们这样做时,每个对属性的引用都具有直接访问示例变量的语法,但它调用的是给定的方法函数。yvgpqqbh2#
.text将检索视口中不存在的文本的空字符串,因此您可以将对象滚动到视口中并尝试. text。它应该检索值。
相反地,innerhtml 可以取得值,即使它出现在视区之外。
rwqw0loc3#
例如,
<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
的算法取决于每个浏览器的webdriver。在某些情况下,例如元素隐藏,当您使用不同的webdriver时,可能会得到不同的文本。我通常从
.get_attribute("innerText")
而不是.text
获取文本,所以我可以处理所有的情况。kqlmhetl4#
Chrome(我不确定其他浏览器)会忽略HTML代码中的多余空格,并将它们显示为一个空格。
.get_attribute('innerHTML')
将返回双倍空格的文本,这是您在检查元素时看到的),而.text
将返回只有1个空格的字符串。这个差异并不小,因为下面的语句将导致NoSuchElementException。
类似地,
.get_attribute('innerHTML')
对于以下内容返回Example Text
,而.text
返回Example Text
。ve7v8dk25#
我刚刚选择了CSS选择器并使用了以下代码:
并打印:
问题是Google Chrome或Chrome上的
h1[itemprop='name']
选择器返回两个匹配的节点,而.product-h1-container.visible-xl-block>h1
只返回一个匹配的节点,这就是为什么它打印出预期的内容。为了证明我的观点,运行下面的代码:
它将打印
因为select_element_by_css_selector选择了第一个具有匹配选择器的元素,并且该元素不包含任何文本,所以它不会打印出来。