如何将 HTML 解析为 Python 中的字符串模板?
How to parse HTML to a string template in Python?
我想解析 HTML 并将它们转换为字符串模板。在下面的示例中,我找到了标有 x-inner
的元素,它们成为最终字符串中的模板占位符。 x-attrsite
也成为模板占位符(当然使用不同的命令)。
输入:
<div class="x,y,z" x-attrsite>
<div x-inner></div>
<div>
<div x-inner></div>
</div>
</div>
期望输出:
<div class="x,y,z" {attrsite}>{inner}<div>{inner}</div></div>
我知道有 HTMLParser 和 BeautifulSoup,但我不知道如何提取 x-*
标记前后的字符串并转义这些字符串模板化。
现有的花括号处理得很好,就像这个例子:
<div x-maybe-highlighted> The template string "there are {n} message{suffix}" can be used.</div>
BeautifulSoup
可以处理的情况:
- 找到所有具有
x-attrsite
属性的 div
元素,删除该属性并添加具有值 None
的 {attrsite}
属性(生成没有值的属性)
- 查找所有具有
x-inner
属性的 div
元素并使用 replace_with()
将元素替换为文本 {inner}
实施:
from bs4 import BeautifulSoup
data = """
<div class="x,y,z" x-attrsite>
<div x-inner></div>
<div>
<div x-inner></div>
</div>
</div>
"""
soup = BeautifulSoup(data, 'html.parser')
for div in soup.find_all('div', {'x-attrsite': True}):
del div['x-attrsite']
div['{attrsite}'] = None
for div in soup.find_all('div', {'x-inner': True}):
div.replace_with('{inner}')
print(soup.prettify())
打印:
<div class="x,y,z" {attrsite}>
{inner}
<div>
{inner}
</div>
</div>
我想解析 HTML 并将它们转换为字符串模板。在下面的示例中,我找到了标有 x-inner
的元素,它们成为最终字符串中的模板占位符。 x-attrsite
也成为模板占位符(当然使用不同的命令)。
输入:
<div class="x,y,z" x-attrsite>
<div x-inner></div>
<div>
<div x-inner></div>
</div>
</div>
期望输出:
<div class="x,y,z" {attrsite}>{inner}<div>{inner}</div></div>
我知道有 HTMLParser 和 BeautifulSoup,但我不知道如何提取 x-*
标记前后的字符串并转义这些字符串模板化。
现有的花括号处理得很好,就像这个例子:
<div x-maybe-highlighted> The template string "there are {n} message{suffix}" can be used.</div>
BeautifulSoup
可以处理的情况:
- 找到所有具有
x-attrsite
属性的div
元素,删除该属性并添加具有值None
的{attrsite}
属性(生成没有值的属性) - 查找所有具有
x-inner
属性的div
元素并使用replace_with()
将元素替换为文本{inner}
实施:
from bs4 import BeautifulSoup
data = """
<div class="x,y,z" x-attrsite>
<div x-inner></div>
<div>
<div x-inner></div>
</div>
</div>
"""
soup = BeautifulSoup(data, 'html.parser')
for div in soup.find_all('div', {'x-attrsite': True}):
del div['x-attrsite']
div['{attrsite}'] = None
for div in soup.find_all('div', {'x-inner': True}):
div.replace_with('{inner}')
print(soup.prettify())
打印:
<div class="x,y,z" {attrsite}>
{inner}
<div>
{inner}
</div>
</div>