Поиск и замена HTML-тега по имени класса и замена тегом, отличным от HTML

#python #beautifulsoup #hugo #hugo-shortcode

#python #beautifulsoup #хьюго #hugo-короткий код

Вопрос:

Я хочу заменить все div теги именем класса «figure»

 <div class="figure">
    <p>Some content.</p>
</div>
  

тегом, отличным от HTML (в моем случае это короткий код Hugo)

 {{% row %}}
    <p>Some content.</p>
{{% /row %}}
  

Легко заменить html-теги другими HTML-тегами, но я понятия не имею, как это сделать, если задействованы теги, отличные от html.

Ответ №1:

Я не вижу «простого» решения, потому что короткие коды также могут содержать / , < > символы, поэтому вы не можете использовать их как часть дерева документа.

Одним из решений является замена <div class="figure"> пользовательского тега и в конечном итоге замена этих пользовательских тегов вашими короткими кодами:

 from bs4 import BeautifulSoup

txt = '''
<div>
    <div class="figure">
        <p>Some content.</p>
    </div>
</div>

<div class="figure">
    <p>Some other content.</p>
</div>
'''

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

for div in soup.select('div.figure'):
    t = soup.new_tag('xxx-row')
    t.contents = div.contents
    div.replace_with(t)

s = str(soup).replace('<xxx-row>', '{{% row %}}')
s = s.replace('</xxx-row>', '{{% /row %}}')

print(s)
  

С принтами:

 <div>
{{% row %}}
<p>Some content.</p>
{{% /row %}}
</div>
{{% row %}}
<p>Some other content.</p>
{{% /row %}}
  

Ответ №2:

Если вы используете Блокнот или любой другой текстовый редактор, который имеет search and replace

функции, которые вы можете просто заменить

'<div class="figure">' с '{{% row %}}' и '</div>' с '{{% /row %}}' .

Комментарии:

1. Это не сработает, так как могут быть и другие конечные </div > теги 🙂

2. Уверен, что есть больше divs с разными классами.

3. Невозможно. Как бы вы отделили </div> от разных классов?