ошибка при использовании list.append() при печати работает нормально

#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:

Перешел к ответу, потому что люди вводят вас в заблуждение относительно достоверной информации.

  1. Да, вам нужны return данные из функции, а не print ее редактирование. Так что измените print на return , и вы будете установлены (при условии, что вы возвращаете строки или очищаете свои данные)

  2. Это хороший урок по отладке кода. Ваша трассировка стека указывает на проблему, но ваш заголовок игнорирует ее, как и некоторые другие. .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. Я полагаю, вы технически правы. Это работает, просто не так, как он хотел или ожидал.