【问题标题】:Beautiful Soup Extract Table InforamtionBeautifulsoup 提取表信息
【发布时间】:2019-04-15 15:04:33
【问题描述】:

我是美汤的新手,我正在尝试从this 网站提取数据。

import bs4
import requests as re
import pandas as pd

class roto_PlayerStats:

    class roto_Player:
        def __init__(self):
            self.name = ""
            self.team = ""
            self.pos = ""
            self.salary = 0
            self.minutes = 0
            self.reb = 0
            self.ast = 0
            self.stl = 0
            self.blk = 0
            self.to = 0
            self.pts = 0
            self.usg = 0
            self.fpts = 0

    def __init__(self):
        self.players =[]

    def load-data(self):
        response = re.get("https://rotogrinders.com/game-stats/nba-player?site=draftkings&range=season")
        soup = BeautifulSoup(response.content, "html.parser")

        for x in soup.find_all('"id'):

            #code to load the individual data?

来自 的数据位于一个结构如下的数组中。这是加载单个玩家数据的正确方法吗?

 $(document).ready(function() {
     var data = [{"id":915,"player":"J.R. Smith","team":"CLE","pos":"SHW","salary":null,"opp":"N\/A","gp":8,"min":"150.00","fgm":18,"fga":51,"ftm":8,"fta":8,"3pm":9,"3pa":27,"reb":13,"ast":13,"stl":10,"blk":2,"to":9,"pts":53,"usg":"18.08","pace":64,"fpts":"115.10"}, {}...]

来自同一域的不同网页的新功能

class grinder_Team:
    def __init__(self):
        self.name = ""
        self.gp = 0
        self.minutes = 0
        self.reb = 0
        self.ast = 0
        self.stl = 0
        self.blk = 0
        self.to = 0
        self.pts = 0
        self.pace = 0
        self.fpts = 0

class grinder_TeamStats:

    def __init__(self):
        self.teams = []

        response = requests.get("https://rotogrinders.com/team-stats/nba-earned?site=draftkings&range=season")
        soup = BeautifulSoup(response.content, 'html.parser')
        proj_stats = soup.find('section', {'class': 'pag bdy'})
        script = proj_stats.find('script')
        data = re.search(r"data\s*=\s*(.*);", script.text).group(1)
        stats = json.loads(data)

        for team in stats:
            # do x

        print ("finished")

我在这一行遇到错误

data = re.search(r"data\s*=\s*(.*);", script.text).group(1)

AttributeError: 'NoneType' object has no attribute 'group'

我不确定为什么会这样,因为我打印了两个链接的脚本和 script.text 变量,它们的输出非常相似。

【问题讨论】:

  • 您在脚本中的 JSON 字符串中观察到的值是否与页面上的内容匹配?

标签: python url web-scraping beautifulsoup


【解决方案1】:

脚本没有分号;从正则表达式中删除,你可以剪切BeautifulSoup并直接使用re

response = requests.get("https://rotogrinders.com/team-stats/nba-earned?site=draftkings&range=season")
data = re.search(r"data\s*=\s*(.*)", response.content).group(1)
stats = json.loads(data)

【讨论】:

    【解决方案2】:

    响应中的数据位于 JavaScript <script> 标记中。加载数据的一种选择是使用regex 在脚本中找到var data 并将其加载到json 对象中:

    import bs4
    import requests     
    import pandas as pd
    import re
    
    proj_stats = soup.find('div', {'id': 'proj-stats'})
    script = proj_stats.find('script')
    data = re.search(r"data\s*=\s*(.*);", script.text).group(1)
    stats = json.loads(data)
    

    现在您有了一个包含每个玩家统计数据的字典列表,您可以将其存储到您的玩家类中:

    $ print(stats)
    
    [{u'gp': 8, u'pos': u'SHW', u'player': u'J.R. Smith', u'pts': 53, u'id': 915, u'usg': u'18.08', u'min': u'150.00', u'fta': 8, u'to': 9, u'blk': 2, u'reb': 13, u'ftm': 8, u'opp': u'N/A', u'ast': 13, u'fgm': 18, u'3pm': 9, u'3pa': 27, u'fga': 51, u'salary': None, u'fpts': u'117.25', u'stl': 10, u'pace': 64, u'team': u'CLE'}, ...] 
    

    注意:不要import requests as re,因为re 会覆盖re 正则表达式模块导入。

    【讨论】:

    • 我在 data = re.search("var data\s*=\s*(.*);", script.text).group(1) AttributeError: module “请求”没有属性“搜索”
    • 感谢您的反馈。抱歉,我忘了在脚本中添加import re。但是你的导入import requests as re 会覆盖它,所以只需使用import requestsresponse = requests.get()。请将您的导入语句替换为我添加到答案中的语句。并将requests 模块引用为requests 而不是re
    • 谢谢。我改变了进口,它的工作原理。能否更深入地解释一下变量 proj_stats、脚本和数据?
    • 我正在尝试为rotogrinders.com/team-stats/… 的类似站点运行相同的功能。数据以同样的方式加载到 html 页面中。
    • 我明白了:对象没有属性“文本”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多