【问题标题】:How to keep </br> tag while reading an html file in python如何在python中读取html文件时保留</br>标签
【发布时间】:2018-08-24 15:49:51
【问题描述】:

我正在尝试阅读和编辑一个 html 文件。我正在使用 BeautifulSoup 来编辑 html,但我发现即使在制作“汤”之前,我的 html 文件已经被 read() 函数解释了。 例如:

<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered)">
</head>

<a href="Aug_24_2018.txt"><b>Aug 24 2018: Report</a></br>
<a href="Aug_23_2018.txt"><b>Aug 23 2018: Report</a></br>
<a href="Aug_22_2018.txt"><b>Aug 22 2018: Report</a></br>
<a href="Aug_21_2018.txt"><b>Aug 21 2018: Report</a></br>
<a href="Aug_20_2018.txt"><b>Aug 20 2018: Report</a></br>

</html>

变成这样:

<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered)">
</head>

<a href="Aug_24_2018.txt"><b>Aug 24 2018: Report</a>
<a href="Aug_23_2018.txt"><b>Aug 23 2018: Report</a>
<a href="Aug_22_2018.txt"><b>Aug 22 2018: Report</a>
<a href="Aug_21_2018.txt"><b>Aug 21 2018: Report</a>
<a href="Aug_20_2018.txt"><b>Aug 20 2018: Report</a>

</html>

这是非常不同的,因为它破坏了格式并将所有域混合在一起。

这是我用来阅读的代码:

with open("/data/report.html") as inf:
    txt = inf.read() #this is where the problem occurs
    soup = bs4.BeautifulSoup(txt, 'lxml') 

我不能随意更改原始文件的格式,所以我想尽可能地符合它。保留&lt;/br&gt; 标签的任何可能解决方案?

【问题讨论】:

  • 使用 'html.parser' 或 'html5lib' 而不是 'lxml'
  • 也是
    ,自闭,不是结束标签。
  • 我重新生成了测试用例,&lt;/br&gt; 只有在使用lxml 解析器解析后才会消失。
  • &lt;/br&gt; 可能你的问题。它使您的 HTML 无效,并且如果没有解析器的各种 hacky 猜测,就无法解析。 lxml 解析器显然只是将它们扔掉,这是合理的。不同的解析器可能会引发异常,或者将其变成对您真正意思的猜测,或者尝试以与 Netscape 4.0.1 完全相同的方式处理它,或其他任何方式。你不能抱怨这些选项中的任何一个都是“错误的”。您的 HTML 不是有效的 HTML,因此如果您希望将其解析为 HTML,它要么会更改,要么无法解析。
  • @LMP 我愿意打赌read 不会 摆脱它,无论你在做什么来调试它,你只是检查了一下它在错误的地方。 See your code running on repl.it&lt;/br&gt;read之后还在,但是解析后就不在了。

标签: python html python-3.x beautifulsoup


【解决方案1】:

似乎有人未能关闭 b-tag 并错误地添加了“/br”-tag。由于这是无效的 HTML,我会警告不要保留它。相反,请考虑将其替换为最初希望是某人的意图的。为此,我会使用文本编辑器,例如记事本或 vim。

打开的文件在读取时不会更改 HTML。

【讨论】:

  • BeautifulSoup最初是一个比 lxml 更宽松的解析器,但很多年都不是这样。从版本 4 开始,它甚至根本不是解析器,它是您选择的解析器(默认使用 lxml)的包装器,为它们提供了更方便、更一致的界面。建议有人在使用 lxml 时查看 lxml,而这正是导致他们问题的原因是愚蠢的。而“如果它不是有效的 HTML,它可能不值得”并不能很好地回答“我如何解析这个无效的 HTML?”
  • 您的正则表达式与 OP 代码中的任何内容都不匹配,实际上与他们要求的完全相反 - 您不是保留无效的 &lt;/br&gt; 标签,而是删除有效的 &lt;br/&gt;标签。
  • @abarnert,我想这可能是我前段时间切换到 xml.etree 的原因。但是我注意到 lxml.etree 存在。这个 lxml 是否带有 etree 风格的 API?
  • 是的,lxml.etree 是 ElementTree API 的超集。它从一开始就是使用 lxml 的主要 API,也是教程中唯一提到的 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多