2017-04-23 126 views
0

我試圖從imdb監視列表中獲取電影標題。這是我的代碼:從imdb中檢索信息的問題

import requests, bs4 
res = requests.get(url) 
res.raise_for_status() 
soup = bs4.BeautifulSoup(res.text, "html.parser") 
print(soup.find_all('.lister-item-header')) 

即使「.lister項頭」在Chrome開發者控制檯它不會在請求模塊下載的HTML文件存在存在。我也嘗試使用正則表達式。什麼是檢索標題的最佳方式?

+0

嘗試[selenium](http://selenium-python.readthedocs.io/) –

+2

而不是網頁抓取,我建議使用[IMDbPY](https://pypi.python.org/pypi/IMDbPY)之類的東西。網絡刮是尷尬和脆弱的;總的來說,這是我儘量避免的。 – Chris

回答

0

你應該以這種方式選擇他們班級的元素。

import requests 
import bs4 

url = 'http://www.imdb.com/chart/top' 
res = requests.get(url) 
res.raise_for_status() 
soup = bs4.BeautifulSoup(res.text, "html.parser") 
rows = soup.select('.titleColumn > a') 

for row in rows: 
    print(row.text) 

或者你可以這樣做:

import requests 
import bs4 

url = 'http://www.imdb.com/chart/top' 
res = requests.get(url) 
res.raise_for_status() 
soup = bs4.BeautifulSoup(res.text, "html.parser") 
rows = soup.find_all('td', class_='titleColumn') 

for row in rows: 
    print(row.a.text) 

的數據是從被嵌入到原始的HTML文件JSON對象負載,所以我們可以分析它,並獲得標題。

JSON

import requests 
import bs4 
import json 

url = 'http://www.imdb.com/user/ur69187878/watchlist?ref_=wt_nv_wl‌​_all_1' 
res = requests.get(url) 
res.raise_for_status() 
soup = bs4.BeautifulSoup(res.text, "html.parser") 
# rows = soup.find_all('h3', class_='list-item-header') 
js_elements = soup.find_all('script') 
js_text = None 
search_str = 'IMDbReactInitialState.push(' 

for element in js_elements: 
    text = element.text 
    if search_str in text: 
     js_text = text.strip() 
     break 

json_start = js_text.index(search_str) + len(search_str) 
json_text = js_text[json_start:-2] 
json_obj = json.loads(js_text[json_start:-2]) 

for title in json_obj['titles']: 
    json_title = json_obj['titles'][title] 
    print(json_title['primary']['title']) 

但我不得不說,這是不是攻擊這類問題的一般方法,如果你想有一個通用的解決方案用於其數據是從JSON或API加載的所有網頁,您可以使用其他方式,如Selenium

+0

這很好用,但它似乎不適用於監視列表。通過打印出res.text,您可以看到電影標題通過javascript調用,而不是在瀏覽器中顯示的html。下面是我的代碼'導入請求 進口BS4 URL = 'http://www.imdb.com/user/ur69187878/watchlist?ref_=wt_nv_wl_all_1' 解析度= requests.get(URL) res.raise_for_status( ) 對於行中的行: print(row('h3',class _ ='list-item-header')) .a.text)' – David