我正在使用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应该能够处理这个,但我无法弄清楚如何。
答案 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'