2013-04-07 2 views
7

У меня есть xml file. скачайте его и сохраните как blog.xml. Это список моих файлов в Google-blogger, я пишу несколько кодов для его синтаксического анализа, есть что-то, сжимающее lxml.Как обрабатывать кодировку в lxml для правильной обработки html-строки?

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) 

Это получить правильный результат с 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() 

Это получить неправильный выход с Кодекса2.

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-строки?

ответ

4

There is a bug в 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 требует, чтобы код проверял исключения в определенных точках, и если это не было сделано, тогда исключение возникает * позже *, когда возникает другое исключение, которое * обрабатывается правильно. Что произойдет, если вы опустите первый вызов 'test'? Имеет ли он тот же самый «XMLSyntaxError»? –

+0

В любом случае это обязательно должно быть сообщено проекту LXML. –

+0

@Martijn Pieters: да, такая же ошибка возникает, первый вызов 'test' должен был только показать, что сообщение' XMLSyntaxError' изменяется после разбора 'e'. – gatto

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.Add 'от LXML импорта etree' 2. может быть, это' печать tree.text_content() '3.but это неправильный выход: Traceback (самый последний вызов последний): Файл «», строка 5, в AttributeError: объект 'lxml.etree._ElementTree' не имеет атрибута 'text_content' –

+0

@it_is_a_literature: действительно, все исправлено. –

+0

Traceback (самый последний вызов последнего): Файл "", строка 5, в AttributeError: объект 'lxml.etree._Element' не имеет атрибута 'TEXT_CONTENT' есть проблема до сих пор. –

Смежные вопросы