2014-11-04 3 views
1

У меня есть такой XML файл:Получение ошибки NoneType при разборе файла XML в Python

<dep type="nsubj"> 
      <governor idx="7">open</governor> 
      <dependent idx="5">it</dependent> 
      </dep> 
      <dep type="aux"> 
      <governor idx="7">open</governor> 
      <dependent idx="6">will</dependent> 
      </dep> 
      <dep type="ccomp"> 
      <governor idx="3">announced</governor> 
      <dependent idx="7">open</dependent> 
      </dep> 

Я хочу, чтобы разобрать его и извлечь глубокий тип, то есть, как nsubj, AUX, ccomp и т.д. I» m делая вот так:

file_list=[] 
with open(xml_file) as f: 
    page = f.read() 
f.close() 
soup = BeautifulSoup(page,"xml") 
for types in soup.find_all('dep'): 
    file_list.append(types.string.strip()) 
print file_list 

Но, я получаю ошибку NoneType. Почему это так?

EDIT:

Traceback:

Traceback (most recent call last): 
    File "/Users/akritibahal/Downloads/stanford-corenlp-2012-07-09/testing.py", line 103, in <module> 
    main() 
    File "/Users/akritibahal/Downloads/stanford-corenlp-2012-07-09/testing.py", line 102, in main 
    extract_top_dependencies('/Users/akritibahal/Downloads/stanford-corenlp-2012-07-09/test') 
    File "/Users/akritibahal/Downloads/stanford-corenlp-2012-07-09/testing.py", line 80, in extract_top_dependencies 
    file_list.append(types.string.strip()) 
AttributeError: 'NoneType' object has no attribute 'strip' 

EDIT2:

Я думаю, что это сог, как я делал XML разбора, что он читает между <> этими метками. Но для dep, я хочу извлечь то, что там в type =, и между тегами open и close нет ничего. Как это сделать?

+0

Пожалуйста, отредактируйте полную трассу, где вы получите ошибку NoneType в свой вопрос. – Marius

+0

Какая строка вызывает это? – Eric

ответ

0

На основе вашего редактирования (и имени types в вашем исходном заявлении for) вы оказались после атрибутов тега, а не строки. Для того, чтобы получить доступ к атрибутам тега, попробовать что-то по следующим направлениям вместо:

>>> xml = """<root><dep type="nsubj"> 
      <governor idx="7">open</governor> 
      <dependent idx="5">it</dependent> 
      </dep> 
      <dep type="aux"> 
      <governor idx="7">open</governor> 
      <dependent idx="6">will</dependent> 
      </dep> 
      <dep type="ccomp"> 
      <governor idx="3">announced</governor> 
      <dependent idx="7">open</dependent> 
      </dep></root>""" 
>>> soup = BeautifulSoup(xml) 
>>> for dep in soup.find_all('dep'): 
    print dep.attrs.get('type') 

nsubj 
aux 
ccomp 

Другими словами, я думаю, что вы хотите что-то вроде этого: вместо

>>> for dep_elem in soup.find_all('dep'): 
     type_ = dep_elem.attrs.get('type') 
     if type_: # be sure type_ is not a NoneType 
      file_list.append(type_.strip()) 

Посмотреть документацию here.

0

Удалить линию

f.close() 

! Это делается автоматически при использовании синтаксиса with open(), а также имя f действует только внутри блока.

+0

Я думаю, что это так, как я делал разбор XML, это то, что он читает между <> этими тегами. Но для dep, я хочу извлечь то, что есть в type =, и между тегами ничего нет. Как это сделать? –