代码之家  ›  专栏  ›  技术社区  ›  alexandernst

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

  •  1
  • alexandernst  · 技术社区  · 6 年前

    我在测试 selenium + chrome VS requests + lxml 为了一些刮擦的目的。我有兴趣收到一些短信。

    使用时 硒+铬 我能做到:

    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的行为与Seal+Chrome相同?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Todor Minakov    6 年前

    简短的回答-这要看情况。在Selenium案例中,您看到的是HTML,在从浏览器进行处理后的表单。它们的主要目的(除了可视化内容,对我们来说,仅仅是人类:)是解析html、css和js,并将后两者应用于前者。从而得到一个结果,这是与他们的(js和css)规则集应用和有效(例如,小字母,在您的例子)。

    lxml或任何其他xml解析库都不会这样做-它们解析xml/html 孤立地 ,他们不知道(或不关心)修改css之类的系统(他们关心xslt,但这是一个非常不同的主题)。因此,你看到的结果是HTML,因为它是写在它的“香草”形式,任何CSS规则,它引用不适用。


    我的意思是“它取决于”,因为你可以在浏览器中加载HTML(或者任何其他解析器)。您可以在 self.driver.page_source WebDriver对象的属性。

    它将HTML保存在浏览器的“inspect element”视图中所看到的相同表单中,可以使用任何JS和CSS结构(和内容)操作。但是,我不认为 正是这个案子 -将应用文本的小写字母;我认为它处于呈现阶段-例如,该值在源代码中为“原样”,但浏览器以不同的方式显示它。很遗憾我没有在电脑前亲自尝试。


    我建议你的另一个方法是试试这个库- requests-html . 它是 requests 一个是HTML解析(khm,只需看看它的名字:d)。它支持对原始html的javascript和“副作用”css解析,并可能为您提供帮助。
    后者是通过 response_object.html.render()