【问题标题】:BeautifulSoup changes > to >BeautifulSoup 将 > 更改为 >
【发布时间】:2019-10-19 02:03:35
【问题描述】:

我需要使用 BeautifulSoup 编辑一些现有的 html 文件。当 DOCTYPE 包含 ATTLIST 元素时会出现问题。

这是一个最小的例子。

from bs4 import BeautifulSoup

doc = """
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>]>
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>
    <meta content="CA43667" name="dc:identifier"/>
  </head>
</html>
"""

soup = BeautifulSoup(doc, features='html.parser')
print(soup.prettify())

输出是

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>
]&gt;
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>
  <meta content="CA43667" name="dc:identifier"/>
 </head>
</html>

正如所见,DOCTYPE 的最后一个“>”变成了一个实体。 与

print(soup.prettify(formatter=None))

我明白了

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>
]>
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type">
  <meta content="CA43667" name="dc:identifier">
 </head>
</html>

现在 DOCTYPE 没问题,但是“元”元素中的结尾斜线消失了,并且文档不会在我们的系统上验证。其他格式化程序选项似乎也不起作用。

有什么解决办法吗?

【问题讨论】:

  • 请注意我已删除的答案:令我失望的是,lxml XML 解析器也无法处理 ATTLIST。

标签: python beautifulsoup


【解决方案1】:

您运行的是最新版本的 BeautifulSoup 吗?我认为您只需要更新 BeautifulSoup。或者它可能是一个奇怪的 BeautifulSoup 安装。在你的命令行中试试这个:

pip uninstall beautifulsoup4
pip install beautifulsoup4

当我运行这个时:

from bs4 import BeautifulSoup

doc = """
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[<!ATTLIST span bodyref CDATA #IMPLIED>]>
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>
    <meta content="CA43667" name="dc:identifier"/>
  </head>
</html>
"""

soup = BeautifulSoup(doc, features='html.parser')
print(soup.prettify(formatter=None))

这是输出:

<?xml version='1.0' encoding='UTF-8'?>                                                                                                                                             
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"                                                                                                                     
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"                                                                                                                          
[<!ATTLIST span bodyref CDATA #IMPLIED>                                                                                                                                            
]>                                                                                                                                                                                 
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">                                                                                                                          
 <head>                                                                                                                                                                            
  <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-type"/>                                                                                                 
  <meta content="CA43667" name="dc:identifier"/>                                                                                                                                   
 </head>                                                                                                                                                                           
</html>      

我相信这就是您想要的。我也在在线 IDE 上对此进行了测试,并且似乎与我的计算机相匹配。这是一个链接:https://onlinegdb.com/HyzXahzAE

【讨论】:

  • 谢谢。我升级了 BeautifulSoup 并拥有最新的 Python 版本,但我仍然得到了上面描述的结果。多么奇怪。如果这很重要,我在 OSX 上。
  • @Patrik OSX 根本不应该有任何区别。我会留下我的答案,以防万一有助于其他人。我能想到的唯一其他建议就是破解它并为&amp;gt;进行字符串替换@
猜你喜欢
  • 2018-07-21
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多