Я пытаюсь создать программу, которая берет ссылку на видео YouTube и число n в качестве входных данных и сканирует n-ое «следующее видео» из начального видео и возвращает список посещенных ссылок.
Моя функция, которая находит следующее видео, иногда сталкивается с этой ошибкой:
... "in find_next_video
next_video_href = next_video_html['href']
TypeError: 'NoneType' object is not subscriptable".
Я бы сказал, каждый 1 из 10 раз. Чаще всего он успешно запускается и возвращает ссылку следующего видео. Шаг перед этим назначает next_video_ html первому тегу с классом "content-link". Таким образом, эта ошибка, насколько я понимаю, означает, что назначение / поиск не выполняется.
Вот функция:
def find_next_video(start_video):
# Get web page
page = requests.get(start_video)
# Parse HTML
soup = BeautifulSoup(page.content, 'html.parser')
#set html class that we will search by
html_class = 'content-link'
# Find first video with matching class
next_video_html = soup.find('a', attrs={'class' : html_class})
#Get href of next video and make link
next_video_href = next_video_html['href']
next_video_link = 'https://www.youtube.com' + next_video_href
Я изменил функцию для целей отладки, чтобы она печатала суп. prettify () (html) для файла, когда hasattr (next_video_ html, 'href') оценивается как false (когда ошибка произойдет, насколько я могу судить). Это показало мне две вещи: функция запроса и синтаксический анализ работают, потому что она печатает в файл. Кроме того, я всегда нахожу класс «content-link» в теге, где я ожидаю его, поэтому я не понимаю, почему он не может его найти.
Я также пробовал time.sleep () (up до 5 секунд), прежде чем делать запросы, но это не оказало влияния. Я предполагаю, что это как-то связано с добавлениями или javascript или чем-то еще, что я не вижу, что происходит.
Вот вставка кода с отладкой. Обратите внимание, что код ошибки, генерируемый этим, потому что функция, вызывающая find_next_video () ничего не возвращает, когда hasattr (next_video_ html, 'href) ') имеет значение true.
Здесь html сохранено на странице, где произошла ошибка. Обратите внимание, что присутствует первый тег с классом "content-link".