Как определить правильные биты HTML для очистки данных эпизода с помощью python - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь улучшить свой Python, играя с Beautifulsoup и requests модулями. Я сделал несколько уроков и успешно собрал данные из разных мест, но не смог заставить это работать. Я знаю, что есть готовый продукт imdb предложение для доступа к данным, но мне нравится использовать сайт для практики Python.

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

import requests
from bs4 import BeautifulSoup

URL = 'https://www.imdb.com/title/tt0094525/episodes?season=5&ref_=tt_eps_sn_5'

headers = {"User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 '
                         '(KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}

page = requests.get(URL, headers=headers)
pageTree = requests.get(URL, headers=headers)
soup = BeautifulSoup(pageTree.content, 'html.parser')

print(soup) #testing its working
print(soup.title.string)

episodes_list = []

episodes = soup.find_all("a", class_="title")

for episode in episodes:
    episodeName = episodes.find("a").get_text()
    episodes_list.append(episodeName)
print(episodes_list)

Очень хотелось бы получить указатели, я знаю, что проблема связана с переменной episodes, но метод проб и ошибок не дал мне ответа.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы ищете элементы с class = title, но если вы посмотрите на HTML, то элементы a, которые вы ищете, не имеют атрибута class. Например:

<a href="/title/tt0676164/"
title="The Adventure of the Egyptian Tomb" itemprop="url">...</a>

Существует атрибут title, но не атрибут class. Читая документацию beautifulsoup , похоже, что вы можете использовать регулярное выражение с фильтром атрибутов, поэтому мы можем, вероятно, сделать что-то вроде этого:

episodes = soup.find_all("a", title=re.compile('.'))

, который находит все с не -empty title атрибут, который, кажется, то, что вы хотите:

>>> episodes = soup.find_all("a", title=re.compile('.'))
>>> [x.get('title') for x in episodes]
['The Adventure of the Egyptian Tomb', 'The Adventure of the Egyptian Tomb', 
'The Underdog', 'The Underdog', 'The Yellow Iris', 'The Yellow Iris', 
'The Case of the Missing Will', 'The Case of the Missing Will', 
'The Adventure of the Italian Nobleman', 'The Adventure of the Italian Nobleman', 
'The Chocolate Box', 'The Chocolate Box', "Dead Man's Mirror", 
"Dead Man's Mirror", 'Jewel Robbery at the Grand Metropolitan', 
'Jewel Robbery at the Grand Metropolitan', 'Share on Facebook', 
'Share on Twitter', 'Share the page', 'Facebook', 'Instagram', 'Twitch',
'Twitter', 'YouTube']
0 голосов
/ 03 мая 2020

Вы можете попробовать что-то вроде этого. Он выберет только название серии и поместит его в список эпизодов.

import requests
    from bs4 import BeautifulSoup

URL = 'https://www.imdb.com/title/tt0094525/episodes?season=5&ref_=tt_eps_sn_5'

headers = {"User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 '
                         '(KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}

page = requests.get(URL, headers=headers)
pageTree = requests.get(URL, headers=headers)
soup = BeautifulSoup(pageTree.content, 'html.parser')



episodes_list = []

episodes = soup.find_all("div",{"class": "info"})

# Iterate over results and print
for episode in episodes:
    episodes_list.append(episode.a.text)


print(episodes_list)

Результат будет выглядеть следующим образом:

['Приключение египетской гробницы' ',' Underdog ',' The Yellow Iris ',' The Case of the Missing Will ',' Приключение итальянского дворянина ',' The Chocolate Box ',' Mirror of Dead Man ',' Ограбление драгоценного камня в Великом митрополите ']

...