【问题标题】:Problems retrieving information from imdb从 imdb 检索信息时出现问题
【发布时间】:2017-04-23 22:11:19
【问题描述】:

我正在尝试从 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-item-header”存在于 chrome 开发者控制台中,它也不存在于请求模块下载的 html 文件中。我也尝试过使用正则表达式。检索标题的最佳方法是什么?

【问题讨论】:

  • 试试selenium
  • 我推荐使用IMDbPY之类的东西,而不是网络抓取。网页抓取笨拙且脆弱;一般来说,这是我尽量避免的。

标签: python beautifulsoup python-requests imdb


【解决方案1】:

您应该以这种方式按类选择元素。

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 对象加载的,因此我们可以对其进行解析并获取标题。

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加载数据的页面都有一个通用的解决方案,您可以使用其他一些方法,例如@ 987654326@.

【讨论】:

  • 这很好用,但它似乎不适用于监视列表。通过打印 res.text,您可以看到电影标题是通过 javascript 而不是它在我的浏览器中显示的 html 调用的。以下是我的代码import requests import bs4 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') for row in rows: print(row.a.text)
猜你喜欢
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2017-04-07
  • 2012-06-28
  • 2014-11-01
  • 2023-01-30
  • 2021-05-16
相关资源
最近更新 更多