【问题标题】:How to get text from HTML element by using lxml.html如何使用 lxml.html 从 HTML 元素中获取文本
【发布时间】:2020-08-25 19:43:12
【问题描述】:

我一直试图从网页https://www.list-org.com/company/11665809 中获取托管在<div> 元素中的全文。
该元素应包含一个子字符串“Арбитраж”。
确实如此,因为我的代码

for div in tree.xpath('.//div[contains(text(), "Арбитраж")]'):
    print(div)

返回响应

Element div at 0x15480d93ac8

但是当我尝试使用方法div.text 获取全文本身时,它返回None
我认为这是一个奇怪的结果。 我该怎么办?
任何帮助将不胜感激。 以及关于学习 HTML 基础知识的源建议(不是一个精明的程序员),以避免将来出现这样简单的问题。

【问题讨论】:

    标签: python html lxml lxml.html


    【解决方案1】:

    这是当 xpath 由宿主语言和库处理时发生的这些奇怪的事情之一。 当你使用 xpath 表达式时

     .//div[contains(text(), "Арбитраж")] 
    

    搜索是根据 xpath 规则执行的,它认为目标文本包含在目标 div 中。 当您继续下一行时:

    print(div.text)
    

    您正在使用 lxml.html,它显然不将目标文本视为 div 文本的一部分,因为它前面有 <i> 标记。要使用 lxml.html,您必须使用:

    print(div.text_content())
    

    或仅使用 xpath:

    print(tree.xpath('.//div[contains(text(), "Арбитраж")]/text()')[0])
    

    似乎 lxml.etree 和 beautifulsoup 使用不同的方法。 See this interesting discussion here.

    【讨论】:

    • 非常感谢,@Jack Fleeting。 在这种情况下,print(div.text_content()) 返回错误AttributeError: 'lxml.etree._Element' object has no attribute 'text_content',但print(tree.xpath('.//div[contains(text(), "Арбитраж")]/text()')[0]) 有效。我不能说它像我想要的那样工作,因为它只提供Арбитраж: ,它不是元素的全文,Арбитраж (1 шт.):。无论如何,现在我知道原因了。
    猜你喜欢
    • 2021-05-16
    • 2017-05-07
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多