scrapy / lxml.html:整合多个连续的标签

时间:2017-09-29 02:39:16

标签: python html scrapy lxml

我正在使用Scrapy从许多网站收集数据。我正在使用 w3lib.html.remove_tags在我的ScrapyField()声明中使用Compose将HTML完全清理为基本的格式化标签:b,em,strong,i和br。然后,我有一个管道将其重建为更清晰,更统一的HTML,以便在另一个网站上显示。

许多被删除的HTML最终会有多个连续的br标记,我需要每次出现时将其合并为单个br标记。这个问题的接受答案是:Merge multiple <br /> tags to a single one with python lxml完全实现了这一点,但是,只有当
标签没有被空格分隔时。假设我的一个ItemLoaders返回以下字符串:

<div class="info"> <br>  <br> <p class="tight"><br> Some text</p><br>  <br></div>

上面提到的解决方案对它们不起作用。怎么可能巩固这些?我正在寻找一种非RegEx解决方案。似乎lxml应该能够处理这个,但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:2)

下面的代码对我来说很好用

from lxml import html
data = """
<div class="info"> <br>   <br> <br> <p class="tight"><br> Some text</p><br>  <br></div>
"""
doc = html.fromstring(data)
for br in doc.findall('.//br'):
    if br.tail is None or br.tail.strip() =='': # no text immediately after <br> tag
        for dup in br.itersiblings():
            if dup.tag != 'br': # don't merge if there is another tag inbetween
                break
            dup.drop_tag()
            if not (dup.tail is None or dup.tail.strip() == ''): # don't merge if there is a text inbetween
                break

print(html.tostring(doc))

输出:

b'<div class="info"> <br>     <p class="tight"><br> Some text</p><br>  </div>\n'