Soup 在一个 IMDB 页面上有效,但在另一个页面上无效。怎么解决?

Soup works on one IMBD page but not on another. How to solve?

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 结构中的任何差异来指示代码应该不同。感谢所有线索。

不幸的是,您想要的 div 由 javascript 代码处理,因此您无法通过 抓取 原始 html 请求.

您可以通过浏览器获取的请求 json 获取您想要的电影,您不需要使用 beautifulsoup 抓取 代码,使您的脚本更快。

第二个选项是使用 Selenium。

祝你好运。

如@SakuraFreak 所述,您可以解析收到的 JSON。但是,此 JSON 响应嵌入在 HTML 本身中,稍后由浏览器 JS 转换为 HTML(这就是您看到的 <div class="lister-item-content">...</div>

例如,这是从 HTML 中提取 JSON 内容以显示监视列表中的 movie/show 姓名的方式:

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"])