python - 使用 BeautifulSoup 编辑 DOCTYPE 标签

标签 python beautifulsoup

我需要向 html 文档中的 DOCTYPE 标记添加 ATTLIST 声明。

阅读文档和谷歌搜索后,这就是我得出的结论:

from bs4 import BeautifulSoup, Doctype

# minimal html document
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" >
<html/>"""

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

# the modified doctype tag
doctype = """<!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>] >"""

dt = BeautifulSoup(doctype, features='html.parser')

for item in soup.contents:
    if isinstance(item, Doctype):
        item.replace_with(dt)
        break

print(soup.prettify(formatter=None))

这会产生所需的结果,但感觉有点“hacky”。 我想将 ATTLIST 部分插入标签中, 而不是像我在这里所做的那样替换整个东西。 有谁知道该怎么做吗?

最佳答案

一个小的改进是构建一个 Doctype 对象并用它替换,例如:

from bs4 import BeautifulSoup, Doctype

# minimal html document
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" >
<html/>"""

# the modified doctype tag
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>]"""

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

for item in soup.contents:
    if isinstance(item, Doctype):
        item.replace_with(Doctype(doctype))
        break

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>
</html>

关于python - 使用 BeautifulSoup 编辑 DOCTYPE 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55910216/

相关文章:

python - Python scikit learn 中分类和回归分数的差异

python - 如何在新列中保存正在读取 pandas read_html() 函数的 url?

python - 如何使用 python 和 beautifulsoup 解析 script 标签

java - Raspberry pi 闪烁的 LED 问题 - Python 与 Java

python - 给定一个输出列表的函数,Python 是否可以为每个组件提取一个函数?

python - 使用 Regex + BeautifulSoup 抓取 XML 并存储到 Pandas

python - 如何用scrapy或者beautiful soup提取特定html标签的内容?

python - 如何提取标签之间的所有文本?

python - 如何递归遍历树并在python中创建访问节点列表

python - Spring Boot 应用程序使用 CLI 触发另一个应用程序