2013-01-05 17 views
5
>>> s = '<div> < 20 </div>' 
>>> import lxml.html 
>>> tree = lxml.html.fromstring(s) 
>>> lxml.etree.tostring(tree) 
'<div> </div>' 

Czy ktoś zna jakieś obejście tego problemu?lxml obcina tekst zawierający znak "mniej niż"

+1

Ta kwota jest podzielona html, ale szkoda, że ​​lxml nie poradzi sobie z wdziękiem. Ten typ html jest bardzo popularny w środowisku naturalnym. – speedplane

Odpowiedz

13

Twoje wejście HTML jest zepsute; ten wspornik lewego wspornika powinien być zakodowany do &lt;. Od lxml documentation na parsowanie zepsutego HTML:

Obsługa parsowania uszkodzonego HTML zależy wyłącznie od algorytmu odzyskiwania libxml2. Nie jest to wina lxml, jeśli znajdziesz dokumenty, które są tak mocno uszkodzone, że parser nie może ich obsłużyć. Nie ma również gwarancji, że wynikowe drzewo będzie zawierać wszystkie dane z oryginalnego dokumentu. Analizator składniowy może być zmuszony do upuszczenia poważnie uszkodzonych części, gdy próbujemy dalej parsować. Zwłaszcza źle umieszczone metatagi mogą na tym ucierpieć, co może prowadzić do problemów z kodowaniem.

Innymi słowy, bierzesz to, co można uzyskać z takich dokumentów, sposób w jaki lxml obsługuje zepsuty kod HTML nie jest konfigurowalny w inny sposób.

Jedną z rzeczy, które możesz może spróbuj użyć różnych parsera HTML. Wypróbuj BeautifulSoup zamiast tego, jest uszkodzona obsługa HTML może dać ci inną wersję tego dokumentu, która daje ci to, czego chcesz. BeautifulSoup może ponownie używać różnych mechanizmów obsługi parsera, w tym lxml i html5lib, dzięki czemu zapewnia większą elastyczność.

html5lib parser nie daje < charakter (przeliczona na &lt; ucieczki):

>>> BeautifulSoup("<div> < 20 </div>", "html5lib") 
<html><head></head><body><div> &lt; 20 </div></body></html> 
+0

ugh, nie robiłem zbyt wiele html przez jakiś czas, zapomniałem o tym średniku na końcu '<' :) – Volatility

+3

Twoja odpowiedź jest wspaniała. Twoja sugestia na temat używania BS z html5lib rozwiązuje problem. Dziękuję Ci. Dla tych, którzy głosują - myślę, że nie rozumieją problemu. – Viacheslav

+1

Ponieważ używasz już 'lxml', warto zauważyć, że ma on [html5parser] (http://lxml.de/html5parser.html), który jest zgodny z zalecanymi przez w3c metodami analizowania (które teoretycznie używa twoja przeglądarka). – mlissner

2

Twoja < powinna być w rzeczywistości &lt;, ponieważ < jest trochę jak "zarezerwowana litera" w html. To powinno działać.

+0

Dzięki, ale potrzebuję pracy bezpośrednio z "<" – Viacheslav

+0

To, czego chcesz, nie ma tutaj żadnego szczególnego znaczenia. Twoje oznaczenia nie są dobrze sformułowane. Żaden analizator XML nie musi zgadywać o poprawianiu marży na śmieci. Więc najpierw popraw swoje oznaczenie * * * –

+8

Twój negatywny ton jest nieistotny. Zbieram trzecią stronę html i muszę ją przetworzyć bez zmian. Przykładem, który podałem jest tylko po to, aby zademonstrować problem. – Viacheslav

Powiązane problemy