2013-04-07 164 views
7

我有一個xml file。請下載並保存爲blog.xml。 這是我的文件在谷歌博客的列表,我寫了一些代碼來解析它,有一些與lxml扭曲的東西。如何處理lxml中的編碼以正確解析html-string?

代碼1:

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) 

它獲得與編碼1一個正確的結果。

碼2:

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() 

它獲得與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() 

它獲得與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 

如何處理lxml中的編碼以正確解析html-string?

回答

4

There is a bug in lxml。 檢查這個代碼的輸出:

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 

因此錯誤是混亂的,爲什麼你的分析失敗的真正原因是,你傳遞空字符串document_fromstring。

試試這個代碼:

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() 
+0

我懷疑在這些條目中*有*解析錯誤,但是lxml在錯誤的位置忽略了該異常。 Python C-API異常處理需要代碼檢查某些點的異常,如果沒有完成,那麼當另一個異常發生* *得到正確處理時,異常會在*之後*突然出現。如果你省略了第一個「測試」電話會發生什麼?他是否與XMLSyntaxError一樣? – 2013-04-16 08:13:39

+0

無論如何,這肯定應該報告給LXML項目。 – 2013-04-16 08:14:27

+0

@Martijn Pieters:是的,同樣的錯誤發生了,第一個'test'調用只是爲了顯示'XMLSyntaxError'消息在解析'e'後發生了變化。 – gatto 2013-04-16 10:20:09

4

你可以自己創建一個解析器,而不是使用document_fromstring

from cStringIO import StringIO 
from lxml import etree 

for num, entry in enumerate(d.entries): 
    text = entry.content[0]['value'].encode('utf8') 
    parser = etree.HTMLParser() 
    tree = etree.parse(StringIO(text), parser) 
    print ''.join(tree.xpath('.//text()')) 

Blogger.com的Atom提要出口,這部作品打印.content[0].value條目的文本內容。

+0

1.新增'從LXML進口etree' 2.也許是'打印tree.text_content()'3.but這是一個錯誤的輸出:回溯(最近通話最後): 文件「」,第5行,在 AttributeError:'lxml.etree._ElementTree'對象沒有屬性'text_content' – 2013-04-07 12:29:39

+0

@it_is_a_literature:實際上,所有更正。 – 2013-04-07 15:22:20

+0

回溯(最近通話最後一個): 文件「」,5號線,在 AttributeError的:「lxml.etree._Element」對象有沒有屬性「TEXT_CONTENT」 有一個問題依然。 – 2013-04-07 22:50:31