【问题标题】:lxml doesn't get all text in element if text has <br />?如果文本具有 <br />,lxml 不会获取元素中的所有文本?
【发布时间】:2015-04-10 07:12:11
【问题描述】:

我正在使用lxml 解析网络文档,我想获取&lt;p&gt; 元素中的所有文本,所以我使用如下代码:

from lxml import etree

page = etree.HTML("<html><p>test1 <br /> test2</p></html>")
print page.xpath("//p")[0].text    # this just print "test1" not "test1 <br/> test2"

问题是我想获取&lt;p&gt; 中的所有文本,在示例中为test1 &lt;br /&gt; test2,但lxml 只需给我test1

如何获取&lt;p&gt; 元素中的所有文本?

【问题讨论】:

  • @har07 看来我应该用text_content(),但是AttributeError: 'lxml.etree._Element' object has no attribute 'html_content'
  • 好的,既然您尝试使用text_content(),我假设您想要没有&lt;br&gt; 的文本。检查我的答案以了解一些可能的方法
  • "我想获取&lt;p&gt; 中的所有文本,即test1 &lt;br /&gt; test2"。这是不正确的。实际文本内容为test1 test2&lt;br /&gt; 元素是 &lt;p&gt; 的子元素,但它不是文本。

标签: python text lxml elementtree


【解决方案1】:

可能是这样

from lxml import etree

pag = etree.HTML("<html><p>test1 <br /> test2</p></html>")
# get all texts
print(pag.xpath("//p/text()"))

['test1', 'test2']

# concate
print("".join(pag.xpath("//p/text()")))

测试1测试2

【讨论】:

    【解决方案2】:

    其他几种可能的方式:

    p = page.xpath("//p")[0]
    print etree.tostring(p, method="text")
    

    或使用 XPath string() 函数(注意 XPath 位置索引从 1 开始而不是 0):

    page.xpath("string(//p[1])")
    

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 1970-01-01
      • 2012-08-15
      • 2021-01-01
      • 1970-01-01
      • 2018-01-19
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多