How to handle the encode in lxml to parse html-string properly?
lxml, python
Solution
There is a bug in lxml. Check output of this code:
import lxml.html
import feedparser
def test():
try:
lxml.html.document_fromstring('')
except Exception as e:
print e
d = feedparser.parse('blog.xml')
e = d.entries[0].content[0]['value'].encode('utf-8')
test() # XMLSyntaxError: None
lxml.html.document_fromstring(e)
test() # XMLSyntaxError: line 1407: Tag b:include invalid
So the error is confusing, the real reason why your parsing fails is that you pass empty strings to document_fromstring.
Try this code:
import lxml.html
import feedparser
d = feedparser.parse('blog.xml')
for num,entry in enumerate(d.entries):
string=entry.content[0]['value'].encode("utf-8")
if not string:
continue
myhtml=lxml.html.document_fromstring(string)
print myhtml.text_content()
Problem
I have a xml file. please download it and save it as `blog.xml`. It is the list of my files in Google-blogger, i write some codes to parse it ,there is a something wring with lxml . code1: ``` from stripogram import html2text import feedparser d = feedparser.parse('blog.xml') for num,entry in enumerate(d.entries): string=entry.content[0]['value'].encode("utf-8") print html2text(string) ``` It get a right result with code1. code2: ``` import lxml.html import feedparser d = feedparser.parse('blog.xml') for num,entry in enumerate(d.entries): string=entry.content[0]['value'] myhtml=lxml.html.document_fromstring(string) print myhtml.text_content() ``` It get a wrong output with code2. ``` Traceback (most recent call last): File "<stdin>", line 3, in <module> File "/usr/lib/python2.7/dist-packages/lxml/html/__init__.py", line 532, in document_fromstring value = etree.fromstring(html, parser, **kw) File "lxml.etree.pyx", line 2754, in lxml.etree.fromstring (src/lxml/lxml.etree.c:54631) File "parser.pxi", line 1569, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:82659) ValueError: Unicode strings with encoding declaration are not supported. ``` code3: ``` import lxml.html import feedparser d = feedparser.parse('blog.xml') for num,entry in enumerate(d.entries): string=entry.content[0]['value'].encode("utf-8") myhtml=lxml.html.document_fromstring(string) print myhtml.text_content() ``` It get a wrong output with code3. ``` Traceback (most recent call last): File "<stdin>", line 3, in <module> File "/usr/lib/python2.7/dist-packages/lxml/html/__init__.py", line 532, in document_fromstring value = etree.fromstring(html, parser, **kw) File "lxml.etree.pyx", line 2754, in lxml.etree.fromstring (src/lxml/lxml.etree.c:54631) File "parser.pxi", line 1578, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:82748) File "parser.pxi", line 1457, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:81546) File "parser.pxi", line 965, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:78216) File "parser.pxi", line 569, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:74472) File "parser.pxi", line 650, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:75363) File "parser.pxi", line 599, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:74827) lxml.etree.XMLSyntaxError: line 1395: Tag b:include invalid ``` How to handle the encode in lxml to parse html-string properly?