Мне нужно пометить некоторые слова lxml. Возьмите это в качестве примера,
<span>Please BOLD me, <br /> BOLD me too</span>
Мне нужно узнать все определенные слова, "BOLD" здесь, и добавить к ним теги. Результат должен быть:
<span>Please <b>BOLD</b> me, <br /> <b>BOLD</b> me too</span>
Он должен использовать lxml, это не только проблема с регулярным выражением. Перед тегированием требуется некоторое вычисление программы. Еще примерно так:
s = '<span>Please BOLD me, <br /> BOLD me too</span>'
from lxml import etree
et = etree.fromstring(s)
for e in et.iter():
if 'BOLD' in e.text:
**tag it**
if 'BOLD' in e.tail:
**tag it**
Думаю, мне нужно создать элемент bold = etree.Element('b'); bold.text = 'BOLD'
bold = etree.Element('b'); bold.text = 'BOLD'
Проблема заключается в том, я не знаю, как вставить выше элемент bold
изящно.
Вы должны вручную создать элемент <b>
и .insert()
на месте. Поместите оставшийся текст в tail
созданного элемента:
import lxml.html
from lxml.html import builder as E
text = '''
<html>
<body>
<span>Please BOLD me</span>
</body>
</html>
'''
doc = lxml.html.fromstring(text)
for span in doc.xpath('//span'):
# search for the word "BOLD" in the span text:
pre, sep, pos = span.text.partition('BOLD')
if sep:
span.text = pre
bold = E.B(sep) # create element
bold.tail = pos
span.insert(0, bold)
print(lxml.html.tostring(doc, pretty_print=True))
Результаты, достижения:
<html>
<body>
<span>Please <b>BOLD</b> me</span>
</body>
</html>
Если вы найдете его в хвосте, вам нужно вставить новый элемент в родительский элемент сразу после найденного элемента:
parent = element.getparent()
parent.insert(parent.index(element) + 1, bold)