【问题标题】:Parse element's tail with requests-html使用 requests-html 解析元素的尾部
【发布时间】:2018-10-01 08:04:27
【问题描述】:

我想用 requests-html 0.9.0 解析这样的 HTML 文档:

from requests_html import HTML
html = HTML(html='<span><span class="data">important data</span> and some rubbish</span>')
data = html.find('.data', first=True)
print(data.html)
# <span class="data">important data</span> and some rubbish
print(data.text)
# important data and some rubbish

我需要区分标签内的文本(由它包围)和标签的尾部(从元素到下一个标签的文本)。这是我最初预期的行为:

data.text == 'important data'
data.tail == ' and some rubbish'

但是tail 没有为Elements 定义。由于 requests-html 提供了对内部 lxml 对象的访问,我们可以尝试从 lxml.etree.Element.tail 获取它:

from lxml.etree import tostring
print(tostring(data.lxml))
# b'<html><span class="data">important data</span></html>'
print(data.lxml.tail is None)
# True

lxml 表示中没有尾巴!带有内部文本的标签是可以的,但尾巴似乎被剥离了。如何提取'and some rubbish'

编辑:我发现full_text 只提供内部文本(“完整”就这么多)。这可以实现从text 中减去full_text 的肮脏技巧,尽管我不确定如果有任何链接它会起作用。

print(data.full_text)
# important data

【问题讨论】:

    标签: python python-requests lxml python-requests-html


    【解决方案1】:

    tail 属性存在于“lxml.html.HtmlElement”类型的对象中。

    我认为你所要求的很容易实现。

    这是一个使用 requests_html 和 lxml 的非常简单的例子:

    from requests_html import HTML
    html = HTML(html='<span><span class="data">important data</span> and some rubbish</span>')
    data = html.find('span')
    print (data[0].text) # important data and some rubbish
    print (data[-1].text) # important data
    print (data[-1].element.tail) #  and some rubbish
    

    element 属性指向 'lxml.html.HtmlElement' 对象。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我不确定我是否理解您的问题,但如果您只想获得'and some rubbish',您可以使用以下代码:

      from requests_html import HTML
      from lxml.html import fromstring
      
      html = HTML(html='<span><span class="data">important data</span> and some rubbish</span>')
      data = fromstring(html.html)
      # or without using requests_html.HTML: data = fromstring('<span><span class="data">important data</span> and some rubbish</span>')
      print(data.xpath('//span[span[@class="data"]]/text()')[-1])  # " and some rubbish"
      

      注意data = html.find('.data', first=True) 会返回不包含" and some rubbish"&lt;span class="data"&gt;important data&lt;/span&gt; 节点——它是父span 的文本子节点!

      【讨论】:

      • 这确实有效,尽管我必须承认这不是我所希望的 HTML Parsing for Humans。至于注释:我认为这与我帖子中的第一个代码块相同?它确实包含“和一些垃圾”,除非我错过了什么。
      • 我很确定print(data.text) 包含"and some rubbish" 是requests-html 的错误。 HTML Parsing for Humans 只是一种廉价的产品广告尝试 :) HTML 本身对 Human 来说并不是很清楚,所以希望有一个工具可以简单地处理 HTML DOM是天真的>
      • 自从 requests_html 发布以来,我一直在关注它,希望在解析 simple HTML 时有一个更 Python 的替代 lxml。 (我不需要它来做任何繁重的工作!)我想我会在 GitHub 上提交一个关于这个的问题。
      • BeautifulSoup 可能被用作 lxml 的替代品,requests-html 更像是 Selenium headless、Scrapy、PyQt 的替代品...
      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2017-01-07
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多