Как получить доступ к комментариям с помощью lxml

Я пытаюсь удалить комментарии из списка элементов, полученных с помощью lxml.

Лучшее, что я смог сделать, это:

no_comments=[element for element in element_list if 'HtmlComment' not in str(type(each))]

Мне интересно, есть ли более прямой путь?

Я собираюсь добавить кое-что на основе ответа Мэтью - он меня почти достал, проблема в том, что когда элемент берется из дерева, комментарии теряют некоторую идентичность (я не знаю, как это описать), так что это невозможно определить являются ли они объектами класса HtmlComment с использованием метода isinstance()

Однако этот метод можно использовать, когда элементы повторяются в дереве.

from lxml.html import HtmlComment
no_comments=[element for element in root.iter() if not isinstance(element,HtmlComment)

Для таких новичков, как я, root — это базовый элемент html, который содержит все остальные элементы дерева, и есть несколько способов получить его. Один из них - открыть файл и выполнить итерацию по нему, поэтому вместо root.iter() в приведенном выше

html.fromstring(open(r'c:\temp\testlxml.htm').read()).iter()

person PyNEwbie    schedule 04.09.2010    source источник


Ответы (1)


Вы можете вырезать строки:

from lxml.html import HtmlComment # or similar
no_comments=[element for element in element_list if not isinstance(element, HtmlComment)]
person Matthew Flaschen    schedule 04.09.2010
comment
Не работало, мой список по-прежнему включал комментарии Хм, но это может работать раньше, чем элементы в element_list, если это комментарии, это комментарии - имеет ли это смысл? Элементом, который является комментарием, является ‹!-- COMMAND=ADD_BASECOLOR,Black --›, элементом, который не является комментарием, является ‹Element br at 12b9928› - person PyNEwbie; 05.09.2010
comment
Но здесь работает elements=[e for e in theTree.cssselect('text')[0].iter()) if not isinstance(e,HtmlComment)] - person PyNEwbie; 05.09.2010