从元素中检索文本时,lxml不尊重css样式

2024-04-20 10:10:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试selenium + chromerequests + lxml以达到一些刮取的目的。我有兴趣收到一些短信。你知道吗

使用selenium + chrome时,我可以:

element = self.driver.find_element_by_xpath(xpath)
return element.text.strip()

它将返回与xpath选择器匹配的元素的文本。文本将显示在网站上,这意味着如果测试本身是小写的,但是它有一个text-transform: uppercase,那么这段代码的输出将是大写文本。你知道吗

如果我对lxml也这么做,如下所示:

elements = self.get_xpath_elements(xpath)
text = ''.join(elements[0].itertext()).strip()

它将返回HTML中显示的文本,而不考虑文本的样式。你知道吗

有没有一种方法可以让lxml像硒+铬一样工作?你知道吗


Tags: text文本self目的driverseleniumelementselement
1条回答
网友
1楼 · 发布于 2024-04-20 10:10:37

简短的回答-视情况而定。在selenium案例中,您看到的是html,它在浏览器中处理后的形式。它们的主要目的(除了可视化内容,对于我们来说,仅仅是人类:))是解析html、css和js,并将后两者应用于前者。从而得到一个应用了(JS和CSS的)规则集并且有效的结果(例如,在你的例子中是小写字母)。你知道吗

lxml或任何其他XML解析库都不会这样做——它们孤立地解析XML/HTML,它们不知道(或关心)如何修改css之类的系统(它们关心XSLT,但这是一个非常不同的主题)。因此,您看到的结果是,HTML以“香草”的形式编写,它引用的任何css规则都不能应用。你知道吗


我说的是“视情况而定”,因为您可以在浏览器呈现/操作HTML时将其加载到lxml(或任何其他解析器)中。您可以在^{}webdriver对象的属性中访问它。你知道吗

它以您在浏览器的“inspect element”视图中看到的相同形式保存html—使用任何JS和CSS结构(和内容)操作。然而,我不认为确切地说,这种情况下——文本的小写,将被应用;我认为它是在呈现阶段——例如,值是“原样”在源代码中,但浏览器的形象不同。遗憾的是,我没有在电脑前亲自试一试。你知道吗


我为您推荐的另一种方法是尝试这个库-requests-html。它是requests之一的一个变体,专注于HTML解析(khm,看看它的名字:D)。它支持对原始HTML进行javascript解析,并作为“副作用”CSS解析,可能会为您提供帮助。
后者是通过^{}实现的

相关问题 更多 >