Как мне игнорировать определенные теги в lxml перед его анализом?

#python #regex #lxml

#python #регулярное выражение #lxml

Вопрос:

Я использую lxml для анализа некоторого xml. Некоторые теги имеют искаженный html, из-за чего lxml выдает ошибки. Мы хотели бы просто пропустить «Tag1» и иметь возможность анализировать остальную часть документа. Мы попробовали следующее, но все равно получаем ошибку «lxml.etree.XMLSyntaxError: несоответствие открывающего и завершающего тегов: b»:

 s = '<?xml version="1.0" encoding="UTF-8"?><myroot><Tag1><b>this is some malformed</Tag1><Tag2>We will continue on</Tag2></myroot>'
xml = etree.fromstring(s)
etree.strip_elements(xml, 'Tag1')
print xml.find('.//Tag2').text
  

Ошибка возникает из-за того, что мы анализируем документ, а затем пытаемся игнорировать Tag1. Есть ли способ игнорировать Tag1 перед тем, как мы проанализируем документ в lxml?

Спасибо!

Ответ №1:

Вместо этого используйте lxml.html.fromstring() . Он более снисходителен к HTML-измам. HTML-версия считывает ваш образец без ошибок.

Ответ №2:

Вы можете использовать BeautifulSoup, который может анализировать неработающий html (xml).

 import bs4
s = '<?xml version="1.0" encoding="UTF-8"?><myroot><Tag1><b>this is some malformed</Tag1><Tag2>We will continue on</Tag2></myroot>'
root=bs4.BeautifulSoup(s, 'lxml')
print root.find('tag2').text #-> We will continue on