当前位置: 代码迷 >> python >> 如何使用 BeautifulSoup4 删除 XML 声明
  详细解决方案

如何使用 BeautifulSoup4 删除 XML 声明

热度:57   发布时间:2023-06-13 14:09:08.0

我有一个结构如下的 XHTML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
...
</body>
<html>

我正在使用 BeautifulSoup 并且我想从文档中删除 XML 声明,所以我看起来像这样:

<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
...
</body>
<html>

我找不到一种方法来获取 XML 声明以将其删除。 据我所知,它似乎不是 Doctype、Declaration、Tag 或 NavigableString。 有没有办法找到它来提取它?

作为一个工作示例,我可以使用这样的代码删除 Doctype(假设文档文本是变量“html”):

soup = BeautifulSoup(html)
[item.extract() for item in soup.contents if isinstance(item, Doctype)]

您可以使用以下方法:

import bs4

soup = bs4.BeautifulSoup(html, 'html.parser')

for e in soup:
    if isinstance(e, bs4.element.ProcessingInstruction):
        e.extract()
        break

print(soup)

对于您的示例,这将为您提供更新后的 HTML:

<!DOCTYPE html>

<html lang="en">
<head>
...
</head>
<body>
...
</body>
<html></html></html>

以下是在一些非常简单的情况下对我有用的方法:

from bs4 import BeautifulSoup
s = "<a value='label'/>"
s = BeautifulSoup(s, 'xml')
print(s)
## <?xml version="1.0" encoding="utf-8"?>
## <a value="label"/>
  1. 使用 bs 语法:

     s.decode_contents() ## '<a value="label"/>'
  2. 使用 string.split:

     str(s).split("\\n")[-1] ## '<a value="label"/>'