#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>
от разных классов?