繁体   English   中英

Soup 可以在一个 IMBD 页面上工作,但不能在另一个页面上工作。 怎么解决?

[英]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 内容以显示关注列表中的电影/节目名称:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM