#python #beautifulsoup
#python #beautifulsoup
Вопрос:
Я пытаюсь создать простой веб-скребок, который будет отправлять мне электронное письмо о сделках, размещенных на странице веб-сайта. Я использую beautifulsoup, чтобы перенести информацию в список под названием «список». Я могу заставить выходные данные выглядеть так, как я хочу, используя команду печати, но когда я пытаюсь использовать те же циклы для добавления строк в список, я получаю следующую ошибку
> ----- Post with most thanks ------ Traceback (most recent call last):
> ----- Trending Hot Deals ------ File "C:/Users/Geoff/PycharmProjects/web_scraping/Historian_file.py", line
> 45, in <module>
> ----- Popular Threads ------
> print "n".join(msg)
> ----- New Posts ------ TypeError: sequence item 0: expected string, NoneType found
>
> Process finished with exit code 1
вот код, закомментированные части не работают, команды печати работают.
def title(number):
if number == 1:
print "----- Post with most thanks ------"
elif number == 2:
print "----- Trending Hot Deals ------"
elif number == 3:
print "----- Popular Threads ------"
else:
print "----- New Posts ------"
msg = []
x = 1
for i in list:
print title(x)
#msg.append(title(x))
x = x 1
for j in i:
l = j.encode_contents()
print l
#msg.append(l)
#print "n".join(msg)
Я ценю любую помощь в этом.
Спасибо
Комментарии:
1. не используйте list в качестве имени переменной
Ответ №1:
Измените print
оператор on return
в title
функции.
def title(number):
if number == 1:
return "----- Post with most thanks ------"
elif number == 2:
return "----- Trending Hot Deals ------"
elif number == 3:
return "----- Popular Threads ------"
else:
return "----- New Posts ------"
Помните, что каждая функция без return
оператора всегда возвращает None
.
Комментарии:
1. Да, вы добавляете результат
title(x)
в свой список.title()
ничего не возвращает, поэтому он возвращаетсяNone
. Поэтому некоторые элементы в вашем спискеNone
.str.join()
требуется, чтобы все элементы были строками.
Ответ №2:
Перешел к ответу, потому что люди вводят вас в заблуждение относительно достоверной информации.
-
Да, вам нужны
return
данные из функции, а неprint
ее редактирование. Так что изменитеprint
наreturn
, и вы будете установлены (при условии, что вы возвращаете строки или очищаете свои данные) -
Это хороший урок по отладке кода. Ваша трассировка стека указывает на проблему, но ваш заголовок игнорирует ее, как и некоторые другие.
.join()
ожидает строковые типы, так что именно это вызывает у вас проблему.
Для отладки странных проблем вам нужно будет уделять больше внимания трассировке стека, которая была немного загромождена prints
(не волнуйтесь — все мы игнорировали эти данные раньше).
None
допустимый тип, который может быть в списке. В результате вызов mylist.append(Foo())
when Foo
ничего не возвращает, добавляется None
в ваш список. Это полностью допустимо.
Однако ваша реальная проблема заключается в том, что вы пытаетесь вызвать .join(ListWithNotStringsInIt)
. Прочитайте это как: я дал .join()
список элементов, по крайней мере, один из них не был строкой и не мог быть неявно приведен к string ( str()
) .
Как вы должны это решить, чтобы избежать проблем в будущем? Очистите свои данные.
Понимание списка — довольно хороший способ сделать это, хотя оно должно быть совершенно ненужным, если вы ответственно обрабатываете свои данные:
'n'.join([str(x) for x in my_list])
Python ожидает, что вы, как программист, разбираетесь в том, как вы можете его использовать. В результате вы получаете много веревок, на которых можно повеситься (например, видеть подобные ошибки).
Понимание списка здесь не требуется, и если вы ответственны за правильное использование своего списка, это совершенно не нужно. Но это способ проверить, что вы получаете, особенно когда возникают исключения, и вы отлаживаете проблему.
Ответ №3:
Ваша title
функция ничего не возвращает, поэтому, когда вы пытаетесь добавить результат вызова функции, вы на самом деле не добавляете результат из title
. Вместо этого вы добавляете None
. Чтобы исправить это, вам нужно вернуть их, а не просто распечатать.
Комментарии:
1. На самом деле это не так,
append
работает просто отлично, он добавляетсяNone
в список. На самом деле.join()
проблема заключается в вызове.2. Правильно. Но, очевидно, он ожидает, что
msg
это будет содержать сообщение, определенноеtitle
функцией. Иmsg
не содержит сообщения, потому что он его не возвращает.3. Я полагаю, вы технически правы. Это работает, просто не так, как он хотел или ожидал.