【问题标题】:How to clean HTML removing repeated paragraphs?如何清理 HTML 删除重复的段落?
【发布时间】:2020-03-01 07:10:15
【问题描述】:

我正在尝试清理正文中包含重复段落的 html 文件。下面我展示了输入文件和预期的输出。

Input.html https://jsfiddle.net/97ptc0Lh/4/

Output.html https://jsfiddle.net/97ptc0Lh/1/

我一直在尝试使用 BeautifulSoup 使用以下代码,但我不知道为什么不起作用,因为结果列表 CleanHtml 包含我想删除的重复元素(段落)。

from bs4 import BeautifulSoup

fp = open("Input.html", "rb")
soup = BeautifulSoup(fp, "html5lib")

Uniques = set()
CleanHtml = []

for element in soup.html:
    if element not in Uniques:
        Uniques.add(element)
        CleanHtml.append(element)   

print (CleanHtml)

请有人帮助我实现这个目标。

【问题讨论】:

  • 根据您提供的输出,已删除重复项。究竟是什么问题?
  • 我显示的输出是预期的输出。我当前的代码没有这样做,呵呵。
  • 我的错。提示:soup.html 只有两个元素,头部和身体。 HTML 文档没有线性结构。这是一棵树。
  • 没问题。感谢您的提示。所以,我需要做类似soup.find_all('p') 的事情来让我列出所有段落?如果是,如何在不影响输出顺序的情况下连接其余不是段落的 HTML 元素?

标签: python parsing beautifulsoup


【解决方案1】:

我认为应该这样做:

elms = []
for elem in soup.find_all('font'):
    if elem not in elms:
        elms.append(elem)
    else:
        target =elem.findParent().findParent()
        target.decompose()
print(soup.html)

这应该会为您提供所需的输出。

编辑:

要仅删除大小不是 4 或 5 的段落,请将 else 块更改为

 else:
    if elem.attrs['size'] != "4" and elem.attrs['size'] !="5":
        target =elem.findParent().findParent()
        target.decompose()

【讨论】:

  • 感谢@JackFleeting 的帮助。我正在尝试使用示例文件,它似乎可以工作,到目前为止我发现的唯一问题是输入文件具有á, é, ñ, Á, É, Ó,Ñ etc 之类的字符,当发送print(soup.html) 时显示Â, ó, Ã� 之类的字符。如何解决这个问题?
  • @GerCas - 看起来像是编码问题;尝试将fp = open("Input.html", "rb") 更改为fp = open("Input.html", "rb", encoding="utf-8") 或任何正确的编码。四处搜寻;不幸的是,这是一个很常见的问题。
  • @GerCas - 在没有看到示例 html 的情况下不确定您的问题。我建议您将其发布(作为一个新问题;SO 不喜欢扩展讨论和多个问题)与既有和没有祖父母的节点一起发布;然后我(和其他人)可以看看。
  • 我明白了。再次感谢杰克
猜你喜欢
  • 2021-10-01
  • 2021-04-30
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多