2009-11-28 41 views
7

Tôi khá mới đối với lxml và HTML Parsers nói chung. Tôi đã tự hỏi nếu có một cách để thay thế một yếu tố trong một cái cây với một yếu tố khác ...Thay thế các phần tử bằng lxml.html

Ví dụ tôi có:

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) 

tôi muốn làm một cái gì đó dọc theo những dòng này, nhưng kết quả này trong "TypeError" vì "hilited" không phải là lxml.etree._Element.

Điều này có khả thi không?

Kính trọng,

+0

Tôi đã tìm kiếm xung quanh và tôi nhận thấy BeautifulSoup có chức năng này chính xác qua replaceWith, là có một cái gì đó tương tự như -this- trong lxml? (Nếu không được, tuy nhiên, tôi vẫn còn bị xâm phạm) Cảm ơn bạn lần nữa! – tsoporan

Trả lời

4

Về lxml,

Trong doc.replace(block, hilited)

khối là đối tượng phần tử của lxml, hilited là chuỗi, bạn không thể thay thế đó.

Có 2 cách để làm điều đó

block.text=hilited 

hoặc

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

Ah tôi hiểu rồi! Điều đó có ý nghĩa. Cảm ơn! – tsoporan

0

Nếu bạn là người mới đến python parsers HTML, bạn có thể thử ra BeautifulSoup, một html/xml parser, cho phép bạn modify the parse tree easily.

+0

Tôi vừa xem xét BeautifulSoup, có vẻ như nó có thể phù hợp hơn với lxml.html để tôi sử dụng. Cám ơn vì sự gợi ý! – tsoporan

Các vấn đề liên quan