2013-06-13 4 views
0

У меня есть файл, заполненный предложениями, завернутыми в хорошо сформированный XML (xmllint и tidylib говорит так). Так что XML выглядит следующим образом:xml разоблачение необъяснимо

<a id="100" attr1="text" attr1="text" attr1="text"> 
<tagname id="1"> 
This is my sentence. 
</tagname> 
</a> 
<a id="101" attr1="text" attr1="text" attr1="text"> 
<tagname id="1"> 
This is my sentence. 
</tagname> 
</a> 

и так далее.

Я использую следующий код для извлечения предложений с атрибутом (в данном случае с идентификатором 1 до 85)

a1 = open(r"file.xml",'r') 
a = a1.readlines() 
a1.close() 
soup = BeautifulSoup(str(a)) 
for i in range(1,85): 
    a = soup.find('a', {'id': i}) 
    achild = a.find('tagname') 
    tagnametext = achild.contents 
    print tagnametext 

все, печатает красиво, до предложения 84, на котором я получаю ошибку: achild = a.find ('tagname') AttributeError: объект «NoneType» не имеет атрибута «find»

Каждый набор ... генерируется с помощью цикла for, так что xml все равно. Я пробовал с разными файлами с различным количеством предложений. Идентификатор, при котором происходит ошибка, также изменяется. Является ли это ограничением beautifulsoup? Что он не может просканировать прошедшее определенное количество строк?

+0

Что идентификационный номер 84 выглядит? – TerryA

ответ

0

Он не работает на последней строке. Это может быть проблема с кодировкой файлов, что строка содержит некоторый смешной символ EOF или что строка не интерпретируется как строка. Вы можете распечатать последнюю строку до того, как она не удалась, и посмотреть, какой тип она есть?

0

Скорее всего a = soup.find('a', {'id': i}) с 84 не возвращает то, что вы ожидаете. find() возвращает None, если тег не найден, таким образом объясняя AttributeError

Кроме того, в вашем коде, вы, кажется, BeautifulSouping список (представленный в виде строки).

soup = BeautifulSoup(str(a)) 

Вы набираете список, а затем получаете список, что глупо. Как насчет супа весь файл, а затем цикл через каждый тег, если он имеет id?

from bs4 import BeautifulSoup 
with open('file.xml', 'r') as myfile: 
    soup = BeautifulSoup(myfile.read()) 
    for i in soup.find_all('a', id=True): 
     print i.tagname.contents 

Печать:

[u'\nThis is my sentence.\n'] 
[u'\nThis is my sentence.\n'] 
+0

soup = BeautifulSoup (myfile.read()) выдает мой IDLE GUI для python. Файл содержит около 140 000 предложений – Jean

+0

@waterling Вероятно, это не лучший выбор. – TerryA

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