如何将 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>