2013-03-04 2 views
2

У меня есть набор XML-файлов, которые мне нужно прочитать и форматировать в один файл CSV. Чтобы читать из файлов XML, я использовал упомянутое решение here.Неопределенная ошибка сущности при использовании ElementTree

Мой код выглядит следующим образом:

from os import listdir 
import xml.etree.cElementTree as et 

files = listdir(".../blogs/") 

for i in range(len(files)): 
    # fname = ".../blogs/" + files[i] 
    f = open(".../blogs/" + files[i], 'r') 
    contents = f.read() 
    tree=et.fromstring(contents) 
    for el in tree.findall('post'): 
     post = el.text 

    f.close() 

Это дает мне ошибку cElementTree.ParseError: undefined entity: на линии tree=et.fromstring(contents). Как ни странно, когда я запускаю каждую из команд в командной строке Python (без использования for-loop), она работает отлично.

В случае, если вы хотите знать структуру XML, она выглядит так:

<Blog> 
<date> some date </date> 
<post> some blog post </post> 
</Blog> 

Так что вызывает эту ошибку, и почему это не работает из файла Python, но работает от командная строка?

Обновление: после чтения this link Я установил files[0] и нашел, что символ '&' встречается несколько раз. Я думаю, что это может вызвать проблему. Я использовал случайный файл для чтения, когда я запускал те же команды в командной строке.

+0

Прежде всего, следует '' .../blogs/"' быть '' ../ blogs "или' "../../ blogs /" '? – skeevey

+0

Ну, конечно, он правильно читает файл. Я не думаю, что это проблема. – Antimony

ответ

1

Как я уже упоминал в обновлении, были некоторые символы, которые, как я подозревал, могут вызвать проблемы. Причина, по которой ошибка возникла, когда я запускал те же строки в командной строке, - это то, что я случайно выбрал файл, у которого не было таких символов.

Поскольку я в основном нуждался в содержании между тегами <post> и </post>, я создал свой собственный парсер (как было предложено в the link mentioned in the update).

from os import listdir 

files = listdir(".../blogs/") 

for i in range(len(files)): 

    f = open(".../blogs/" + files[i], 'r') 
    contents = f.read() 
    seek1 = contents.find('<post>') 
    seek2 = contents.find('</post>', seek1+1) 
    while(seek1!=-1): 
     post = contents[seek1+5:seek2+6] 
     seek1 = contents.find('<post>', seek1+1) 
     seek2 = contents.find('</post>', seek1+1) 

    f.close() 
Смежные вопросы