2015-06-03 4 views
0

Я пытаюсь очистить информацию от Википедии, используя приведенную ниже функцию, но я столкнулся с Ошибка атрибута, потому что возвращается вызов функции Нет. Может ли кто-нибудь попробовать и объяснить, почему это возвращается? Нет?Почему это возвращает NoneType?

import wikipedia as wp 
import string 

def add_section_info(search): 
    HTML = wp.page(search).html().encode("UTF-8") #gets HTML source from Wikipedia 

    with open("temp.xml",'w') as t: #write HTML to xml format 
     t.write(HTML) 

    table_of_contents = [] 
    dict_of_section_info = {} 

    #This extracts the info in the table of contents 
    with open("temp.xml",'r') as r: 
     for line in r: 
      if "toclevel" in line: 
       new_string = line.partition("#")[2] 
       content_title = new_string.partition("\"")[0] 
       tbl = string.maketrans("_"," ") 
       content_title = content_title.translate(tbl) 
       table_of_contents.append(content_title) 

    print wp.page(search).section("Aortic rupture") #this is None, but shouldn't be 

    for item in table_of_contents: 
     section = wp.page(search).section(item).encode("UTF-8") 
     print section 
     if section == "": 
      continue 
     else: 
      dict_of_section_info[item] = section 

    with open("Section_Info.txt",'a') as sect: 
     sect.write(search) 
     sect.write("------------------------------------------\n") 
     for item in dict_of_section_info: 
      sect.write(item) 
      sect.write("\n\n") 
      sect.write(dict_of_section_info[item]) 
     sect.write("####################################\n\n") 

add_section_info("Abdominal aortic aneurysm") 

То, что я не понимаю, что если я бегу add_section_info("HIV"), к примеру, она прекрасно работает.

Исходный код для импортированной Википедию here

Мой выход на приведенный выше код следующим образом:

Abdominal aortic aneurysm 

Signs and symptoms 
Traceback (most recent call last): 
    File "/home/pharoslabsllc/Documents/wikitest.py", line 79, in <module> 
add_section_info(line) 
    File "/home/pharoslabsllc/Documents/wikitest.py", line 30, in add_section_info 
    section = wp.page(search).section(item).encode("UTF-8") 
AttributeError: 'NoneType' object has no attribute 'encode' 
+0

Можете ли вы сказать нам, где происходит эта ошибка? Просто добавьте трассировку к вопросу. – TigerhawkT3

+0

Попробуйте 'print (repr (item))' внутри цикла, который терпит неудачу. – Bakuriu

+1

У вас есть значение, жестко закодированное там. Что произойдет, если вместо 'print wp.page (search) .section (" Aortic rupture ")' you did 'print wp.page (search) .section (item)'? – Makoto

ответ

2

Метод page никогда не возвращает None (вы можете легко проверить это в исходном коде), однако section метода делает возвращения None если название не может быть найдено. Смотрите documentation:

section(section_title)

Получить простое текстовое содержание раздела от self.sections. Возвращает None, если section_title не найден, в противном случае возвращает строку, разделенную пробелами.

Таким образом, ответ в том, что страница википедии вы имеете в виду не имеет раздел под названием Aortic rupture, , насколько библиотека обеспокоен.

Глядя на википедию, похоже, страница Abdominal aortic aneurysm имеет такой раздел.

Обратите внимание, что если вы попытаетесь проверить, что такое значение wp.page(search).sections, вы получаете: []. То есть кажется, что библиотека не разбирает разделы правильно.


Из исходного кода библиотеки нашли here вы можете увидеть этот тест:

section = u"== {} ==".format(section_title) 
try: 
    index = self.content.index(section) + len(section) 
except ValueError: 
    return None 

Однако:

In [14]: p.content.find('Aortic') 
Out[14]: 3223 

In [15]: p.content[3220:3220+50] 
Out[15]: '== Aortic ruptureEdit ===\n\nThe signs and symptoms ' 
In [16]: p.section('Aortic ruptureEdit') 
Out[16]: "The signs and symptoms of a ruptured AAA may includes severe pain in the lower back, flank, abdomen or groin. A mass that pulses with the heart beat may also be felt. The bleeding can leads to a hypovolemic shock with low blood pressure and a fast heart rate. This may lead to brief passing out.\nThe mortality of AAA rupture is up to 90%. 65–75% of patients die before they arrive at hospital and up to 90% die before they reach the operating room. The bleeding can be retroperitoneal or into the abdominal cavity. Rupture can also create a connection between the aorta and intestine or inferior vena cava. Flank ecchymosis (appearance of a bruise) is a sign of retroperitoneal bleeding, and is also called Grey Turner's sign.\nAortic aneurysm rupture may be mistaken for the pain of kidney stones, muscle related back pain." 

Обратите внимание на Edit ==. Другими словами, в библиотеке есть ошибка, которая не учитывает ссылку для редактирования.

Этот же код работает со страницей для HIV, потому что на этой странице заголовки не имеют ссылки edit рядом с ними. Я понятия не имею, почему это так, в любом случае это похоже на ошибку или недостаток библиотеки, поэтому вам следует открыть билет на свой трекер.

В то же время вы можете использовать простой исправить, как:

def find_section(page, title): 
    res = page.section(title) 
    if res is None: 
     res = page.section(title + 'Edit') 
    return res 

и использовать эту функцию вместо того, чтобы использовать метод .section. Однако это может быть только временное исправление.

+0

У вас есть идеи, почему работа над 'add_section_info (" HIV ")' будет работать правильно? Потому что даже с «ВИЧ», вызывая 'wp.page (search) .sections' возвращает' [] ', поэтому я должен сделать это обходное решение. –

+0

@MIT_noob Это связано с ссылкой «edit», см. Мое последнее изменение. Если вы проверяете страницу «ВИЧ», в большинстве заголовков отсутствует эта ссылка, и поэтому библиотека работает. Однако я не знаком с википедией и как они показывают материал. Я предлагаю вам открыть билет в контролере ошибок библиотеки, потому что это кажется либо ошибкой, либо отсутствующей функцией, которая не документирована. – Bakuriu

+0

Спасибо! Быстрый вопрос: Можете ли вы объяснить, что означает 'p.content [3220: 3220 + 50]' делает? –

0

wp.page(search).section(item) не найти раздел, который вы ищете, и возвращает None. Вы не проверяете его и пытаетесь обрабатывать значение в виде строки; это, как ожидается, не удастся.

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