Суп работает на одной странице IMBD, но не работает на другой. Как решить? - PullRequest
1 голос
/ 09 мая 2020
url1 = "https://www.imdb.com/user/ur34087578/watchlist"
url = "https://www.imdb.com/search/title/?groups=top_1000&ref_=adv_prv"

results1 = requests.get(url1, headers=headers)
results = requests.get(url, headers=headers)
soup1 = BeautifulSoup(results1.text, "html.parser")
soup = BeautifulSoup(results.text, "html.parser")

movie_div1 = soup1.find_all('div', class_='lister-item-content')
movie_div = soup.find_all('div', class_='lister-item mode-advanced')
#using unique tag for each movie in the respective link

print(movie_div1)
#empty list
print(movie_div)
#gives perfect list

Почему movie_div1 дает пустой список? Я не могу определить какие-либо различия в структурах URL-адресов, чтобы указать, что код должен быть другим. Все предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Как упоминалось в @SakuraFreak, вы можете проанализировать полученное JSON. Однако этот ответ JSON встроен в сам HTML, который позже преобразуется в HTML браузером JS (это то, что вы видите как <div class="lister-item-content">...</div>.

Например, это как извлечь содержимое JSON из HTML для отображения названий фильмов / шоу из списка наблюдения:

import requests
from bs4 import BeautifulSoup
import json

url = "https://www.imdb.com/user/ur34087578/watchlist"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

details = str(soup.find('span', class_='ab_widget'))

json_initial = "IMDbReactInitialState.push("
json_leftover = ");\n"

json_start = details.find(json_initial) + len(json_initial)
details = details[json_start:]
json_end = details.find(json_leftover)

json_data = json.loads(details[:json_end])

imdb_titles = json_data["titles"]
for item in imdb_titles.values():
    print(item["primary"]["title"])
0 голосов
/ 09 мая 2020

К сожалению, нужный вам div обрабатывается кодом javascript, поэтому вы не можете получить его, отбросив необработанный html запрос.

Вы можете получить нужные фильмы по запросу json ваш браузер получает, что вам не нужно сбрасывать код с помощью beautifulsoup, что делает ваш скрипт намного быстрее.

2-й вариант использует Selenium.

Удачи.

...