【问题标题】:Web scrape specific data from imdb project从 imdb 项目 Web 抓取特定数据
【发布时间】:2020-04-19 01:39:11
【问题描述】:

所以我想从imdb中提取分数在8.7以上的电影分数。

我已经这样做到这里,但我不知道下一步该怎么做

import re
import requests
from bs4 import BeautifulSoup
l = list()
r = requests.get('https://www.imdb.com/chart/top?ref_=nv_mv_250')
soup = BeautifulSoup(r.text,'html.parser')
res = soup.find_all('strong')
for x in res:
    q = re.sub(r'\s+',' ',x.text)
    print(q)

它给了我所有的分数。我只想要8.7及以上。 并感谢您的回答!

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup


    【解决方案1】:

    好的,首先:

    提供的数据并不一致,200 和 206 两个值确实高于 8.7 评级,但我想不适合从 0 到 10 评级的整个模型。

    我已经编辑了代码,因此它当前正在打印评分值。 请注意表达式:

    if my_float >= 8.7 and my_float <= 10:
    

    此表达式不仅确保您获得的分数等于或高于 8.7,而且它们不能等于或高于最高评分 10。

    import re
    import requests
    from bs4 import BeautifulSoup
    
    r = requests.get('https://www.imdb.com/chart/top?ref_=nv_mv_250')
    soup = BeautifulSoup(r.text,'html.parser')
    res = soup.find_all('strong')
    for x in res:
        q = re.sub(r'\s+',' ',x.text)
        try:
            my_float = float(q)
            if my_float >= 8.7 and my_float <= 10:
                print(q)
        except ValueError as error:
            print(error)
    

    希望这会有所帮助。如果您希望对数据做任何其他事情而不是将其打印出来。请务必检查列表推导或使用下面提供的另一个代码块

    (我注意到你创建了一个空列表l = list()

    import re
    import requests
    from bs4 import BeautifulSoup
    
    l = list()
    r = requests.get('https://www.imdb.com/chart/top?ref_=nv_mv_250')
    soup = BeautifulSoup(r.text,'html.parser')
    res = soup.find_all('strong')
    for x in res:
        q = re.sub(r'\s+',' ',x.text)
        try:
            my_float = float(q)
            if my_float >= 8.7 and my_float <= 10:
                l.append(my_float)
                print(q)
        except ValueError as error:
            print(error)
    

    【讨论】:

      【解决方案2】:

      只需将评分转换为浮点数并进行比较

      import requests
      from bs4 import BeautifulSoup as bs
      
      r = requests.get('https://www.imdb.com/chart/top?ref_=nv_mv_250')
      soup = bs(r.content, 'lxml')
      
      for tr in soup.select('.lister-list tr'):
          rating = float(tr.select_one('.imdbRating').text)
          if rating >= 8.7:
              print(tr.select_one('.titleColumn a').text.strip(), rating )
      

      可读性较差的列表理解:

      import requests
      from bs4 import BeautifulSoup as bs
      
      r = requests.get('https://www.imdb.com/chart/top?ref_=nv_mv_250')
      soup = bs(r.content, 'lxml')
      results = [(tr.select_one('.titleColumn a').text.strip(), float(tr.select_one('.imdbRating').text))  for tr in soup.select('.lister-list tr') if float(tr.select_one('.imdbRating').text) >= 8.7]
      print(results)
      

      【讨论】:

        【解决方案3】:

        以下代码显示了如何创建评分大于或等于 8.7 的电影列表。

        import re
        import requests
        from bs4 import BeautifulSoup
        l = list()
        r = requests.get('https://www.imdb.com/chart/top?ref_=nv_mv_250')
        soup = BeautifulSoup(r.text,'html.parser')
        s = soup.find_all("tbody", class_="lister-list")
        desired_list = []
        for movie in s[0].findChildren("tr" , recursive=False):
            title = movie.find_all("a")
            rating = movie.find_all("strong")
            q = re.sub(r'\s+',' ',rating[0].text)
                try:
                    rating = float(q)
                    if rating >= 8.7:
                        desired_list.append((rating, title[1].contents[0]))
                except Exception as e:
                    print e
        print desired_list
        
        

        【讨论】:

        • 如果我想要电影的名字怎么办?我的意思是如果评分高于 8.7,
        • @Sam 我已经更新了代码,现在添加了电影名称以及评分 >= 8.7。
        猜你喜欢
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        • 2011-01-30
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        相关资源
        最近更新 更多