Не ясно, почему моя функция не возвращает ни одного

У меня очень ограниченный фон кодирования, за исключением некоторого Ruby, поэтому, если есть лучший способ сделать это, пожалуйста, дайте мне знать!

По сути, у меня есть.txt файл, полный слов. Я хочу импортировать файл.txt и превратить его в список. Затем я хочу взять первый элемент в списке, назначить его переменной и использовать эту переменную во внешнем запросе, который отправляется, чтобы получить определение слова. Определение возвращается и помещается в другой файл.txt. Как только это будет сделано, я хочу, чтобы код захватил следующий элемент в списке и делал все это снова, пока список не будет исчерпан.

Ниже мой код в процессе, чтобы дать представление о том, где я нахожусь. Я все еще пытаюсь понять, как правильно перебирать список, и мне трудно интерпретировать документацию.

Извините заранее, если об этом уже спрашивали! Я искал, но не мог найти ничего, что конкретно ответило бы на мою проблему.

from __future__ import print_function
import requests
import urllib
from bs4 import BeautifulSoup

def get_definition(x):

    url = 'http://services.aonaware.com/DictService/Default.aspx?action=define&dict=wn&query={0}'.format(x)
    html = urllib.urlopen(url).read()
    soup = BeautifulSoup(html, "lxml")
    return soup.find('pre', text=True)[0]

lines = []
with open('vocab.txt') as f:
    lines = f.readlines()
lines = [line.strip() for line in lines]

definitions = []
for line in lines:
    definitions.append(get_definition(line))

out_str = '\n'.join(definitions)
with open('definitions.txt', 'w') as f:
    f.write(out_str)

проблема у меня есть

Traceback (most recent call last):
  File "WIP.py", line 20, in <module>
    definitions.append(get_definition(line))
  File "WIP.py", line 11, in get_definition
    return soup.find('pre', text=True)[0]
  File "/Library/Python/2.7/site-packages/bs4/element.py", line 958, in __getitem__
    return self.attrs[key]
KeyError: 0

Я это понимаю soup.find('pre', text=True) возвращается None, но не почему или как это исправить.

1 ответ

Ваша проблема в том, что find() возвращает один результат, а не список. Результатом является объект, похожий на dict, поэтому он пытается найти ключ 0 что это не может.

просто удалите [0] и ты должен быть в порядке

Также soup.find(...) не возвращается None, Это ответ на вопрос! Если бы это возвращалось None вы получите ошибку

NoneType has no attribute __getitem__

Красивая суповая документация для find()

Другие вопросы по тегам