[英]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.