gpt4 book ai didi

python - 使用scrapy和XPath处理html文本节点

转载 作者:行者123 更新时间:2023-12-01 03:42:12 24 4
gpt4 key购买 nike

我正在使用 scrapy 来处理这样的文档:

...
<div class="contents">
some text
<ol>
<li>
more text
</li>
...
</ol>
</div>
...

我想将内容区域内的所有文本收集到一个字符串中。我还需要 <li> 中的“1.、2.、3....”元素,所以我的结果应该是 'some text 1. more text...'

所以,我正在循环 <div class="contents">的 children

for n in response.xpath('//div[@class="contents"]/node()'):
if n.xpath('self::ol'):
result += process_list(n)
else:
result += n.extract()

如果n是一个有序列表,我循环遍历它的元素并将一个数字添加到 li/text() (在 process_list() 中)。如果n本身就是一个文本节点,我只是读取它的值。然而,'some text'似乎不是节点集的一部分,因为循环没有进入 else部分。我的结果是'1. more text'

查找相对于其父节点的文本节点的工作原理:

response.xpath('//div[@class="contents"]//text()')

找到所有文本,但这样我无法添加列表项编号。

我做错了什么,有更好的方法来完成我的任务吗?

最佳答案

Scrapy 的选择器在底层使用 lxml,但是 lxml doesn't work with XPath calls on text nodes

>>> import scrapy
>>> s = scrapy.Selector(text='''<div class="contents">
... some text
... <ol>
... <li>
... more text
... </li>
... ...
... </ol>
... </div>''')
>>> s.xpath('.//div[@class="contents"]/node()')
[<Selector xpath='.//div[@class="contents"]/node()' data='\n some text\n '>, <Selector xpath='.//div[@class="contents"]/node()' data='<ol>\n <li>\n more text\n'>, <Selector xpath='.//div[@class="contents"]/node()' data='\n'>]
>>> for n in s.xpath('.//div[@class="contents"]/node()'):
... print(n.xpath('self::ol'))
...
[]
[<Selector xpath='self::ol' data='<ol>\n <li>\n more text\n'>]
[]

但是您可以侵入底层 lxml 对象来测试它的文本节点类型(它“隐藏”在每个 scrapy 选择器的 .root 属性中):

>>> for n in s.xpath('.//div[@class="contents"]/node()'):
... print([type(n.root), n.root])
...
[<class 'str'>, '\n some text\n ']
[<class 'lxml.etree._Element'>, <Element ol at 0x7fa020f2f9c8>]
[<class 'str'>, '\n']

另一种方法是使用一些 HTML 到文本的转换库,例如 html2text

>>> import html2text
>>> html2text.html2text("""<div class="contents">
... some text
... <ol>
... <li>
... more text
... </li>
... ...
... </ol>
... </div>""")
'some text\n\n 1. more text \n...\n\n'

关于python - 使用scrapy和XPath处理html文本节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39415890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com