【发布时间】:2019-10-21 22:24:45
【问题描述】:
这是关于 lxml 和 Selenium 处理 xpath 表达式的不同方式的几个问题中的第一个。 (虽然有些相似,但我相信这是 is different from this question)。
让我们从更简单的问题开始。
这是字符串:
my_str = """
<div class="container">
<div class="24">
<div class="25">forget me</div>
<div class="26">a target </div>
</div>
<div class="27">very desired
<div class="28">whatever</div>
<div class="29">another target</div>
</div>
<div class="30">go home
<div class="31">Nothing here</div>
<div class="32">somewhat desired</div>
</div>
</div>
"""
这是 xpath 表达式:
simple_expression = "//*[contains(text(), 'target')]"
现在让我们看看 lxml 是如何处理的:
import lxml.html
root = lxml.html.fromstring(my_str)
e = root.xpath(simple_expression)
for entry in e:
print(entry.text)
这会产生所需的输出:
一个目标
另一个目标
转到 Selenium:
from selenium.webdriver import Chrome
driver = Chrome()
driver.get("data:text/html;charset=utf-8,{html_content}".format(html_content=my_str))
e2 = driver.find_element_by_xpath(simple_expression)
print(e2.text)
这次的输出只有
一个目标
那么 - 首先,为什么会这样?第二,如何使 Selenium 产生相同的输出?
【问题讨论】: