Вопрос

Я новичок в lxml и парсерах HTML в целом.Мне было интересно, есть ли способ заменить элемент внутри дерева другим элементом...

Например, у меня есть:

body = """<code> def function(arg): print arg </code> Blah blah blah <code> int main() { return 0; } </code> """

doc = lxml.html.fromstring(body)
codeblocks = doc.cssselect('code')

for block in codeblocks:
  lexer = guess_lexer(block.text_content())
  hilited = highlight(block.text_content(), lexer, HtmlFormatter())
  doc.replace(block, hilited)

Я хочу сделать что-то в этом направлении, но это приводит к ошибке «TypeError», потому что «hilited» не является lxml.etree._Element.

Возможно ли это?

С уважением,

Это было полезно?

Решение

Что касается lxml,

В doc.replace(block, hilited)

блокировать это объект Element lxml, высоко оцененный это строка, вы не можете заменить ее.

Есть 2 способа сделать это

block.text=hilited 

или

body=body.replace(block.text,hilited)

Другие советы

Если вы новичок в анализаторах HTML Python, вы можете попробовать КрасиваяСуп, анализатор html/xml, который позволяет вам легко изменить дерево разбора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top