Vấn đề là thế này: Tôi có một mảnh XML như sau:Trong lxml, làm cách nào để xóa thẻ nhưng giữ lại tất cả nội dung?
<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>
Đối với kết quả này, tôi muốn xoá tất cả <a>
- và <c>
-Tags, nhưng giữ lại (văn bản) -contents của họ, và childNodes chỉ như họ. Ngoài ra, các <b>
-Element nên được bỏ hoang. Kết quả sau đó sẽ giống như vậy
<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>
Đối với thời điểm hiện tại, tôi sẽ trở lại với một thủ thuật rất bẩn: Tôi sẽ etree.tostring đoạn, loại bỏ các thẻ vi phạm qua regex, và thay thế các đoạn ban đầu với các etree.fromstring kết quả của việc này (không phải là mã thực, nhưng nên đi một cái gì đó như thế này):
from lxml import etree
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>")
fstring = etree.tostring(fragment)
fstring = fstring.replace("<a>","")
fstring = fstring.replace("</a>","")
fstring = fstring.replace("<c>","")
fstring = fstring.replace("</c>","")
fragment = etree.fromstring(fstring)
tôi biết rằng tôi có lẽ có thể sử dụng XSLT để đạt được điều này, và tôi biết rằng lxml có thể tận dụng XSLT , nhưng phải có cách tiếp cận bản địa lxml nhiều hơn?
Để tham khảo: Tôi đã cố gắng đến đó với phần tử lxml.replace, nhưng vì tôi muốn chèn văn bản có nút phần tử trước đây, tôi không nghĩ mình có thể làm điều đó.
Cảm ơn, công trình này hoàn hảo. Thuật ngữ "dải" không xảy ra với tôi, hoặc tôi có thể tự tìm ra câu trả lời :) – Thor
Nghiêm túc. Bạn sẽ đến PyCon 2011? Nếu vậy, hãy để tôi mua cho bạn một ly bia, hoặc bất cứ thứ gì bạn thích. Bạn chỉ cần làm đêm của tôi :) – mkelley33
Cũng tuyệt vời: '' etree.strip_elements (đoạn, * ['tag1', 'tag2']) '' – mkelley33