Python - Как изящно пометить слова в текстах?

1

Мне нужно пометить некоторые слова 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 изящно.

Теги:
lxml

1 ответ

3
Лучший ответ

Вы должны вручную создать элемент <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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню