scrapy / lxml.html : 合并多个连续的 <br> 标签
scrapy / lxml.html : Consolidate multiple consecutive <br> tags
我正在使用 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 完全做到了这一点,但是,只有当
标签没有被空格分隔时。假设我的一个 ItemLoader returns 以下字符串:
<div class="info"> <br> <br> <p class="tight"><br> Some text</p><br> <br></div>
上面提到的解决方案对它们不起作用。怎么可能巩固这些?我正在寻找非 RegEx 解决方案。看起来 lxml 应该能够处理这个问题,但我不知道如何处理。
下面的代码适合我
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'
我正在使用 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 完全做到了这一点,但是,只有当
标签没有被空格分隔时。假设我的一个 ItemLoader returns 以下字符串:
<div class="info"> <br> <br> <p class="tight"><br> Some text</p><br> <br></div>
上面提到的解决方案对它们不起作用。怎么可能巩固这些?我正在寻找非 RegEx 解决方案。看起来 lxml 应该能够处理这个问题,但我不知道如何处理。
下面的代码适合我
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'