python beautifulsoup 将 html 标签添加到 svg

xar*_*tra 4 python svg beautifulsoup

在解析SVG文件时,我注意到 beautifulsoup 添加了html标签。

from bs4 import BeautifulSoup
soup = BeautifulSoup('<svg></svg>', 'lxml')
print(soup)
Run Code Online (Sandbox Code Playgroud)

结果是:

<html><body><svg></svg></body></html>
Run Code Online (Sandbox Code Playgroud)

为什么会这样?可以避免吗?

el.*_*ado 5

您使用lxml解析器,即 HTML 解析器。要解析 XML,您应该使用xml parser:

\n\n
from bs4 import BeautifulSoup\nsoup = BeautifulSoup(\'<svg></svg>\', \'xml\')\nprint(soup)                       # ^^^^^^\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自 BeautifulSoup 文档:

\n\n
\n

Beautiful Soup 向许多不同的解析器提供相同的接口,但每个解析器都是不同的。不同的解析器将从同一文档创建不同的解析树。最大的区别在于 HTML 解析器和 XML 解析器之间。 Here\xe2\x80\x99s a short\n document, parsed as HTML:

\n\n
BeautifulSoup("<a><b /></a>")\n# <html><head></head><body><a><b></b></a></body></html>\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于空标签不是有效的 HTML,解析器将其转换为\n 标签对。

\n\n

这里\xe2\x80\x99s 是解析为 XML 的相同文档(运行此文件需要安装 lxml)。请注意,空标记被单独保留,并且为文档提供了 XML 声明,而不是放入标记中。:

\n\n
BeautifulSoup("<a><b /></a>", "xml")\n# <?xml version="1.0" encoding="utf-8"?>\n# <a><b/></a>\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

来源:解析器之间的差异,重点是我的。

\n