3

我想用 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它只提供内部文本(“完整”就这么多)。full_text这可以实现从中减去的肮脏技巧text,尽管我不肯定如果有任何链接它会起作用。

print(data.full_text)
# important data
4

2 回答 2

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)返回<span class="data">important data</span>不包含的节点" and some rubbish"- 它是 parent 的文本子节点span

于 2018-04-21T10:58:49.647 回答
0

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”对象。

希望这可以帮助。

于 2021-08-05T16:50:07.843 回答