【问题标题】:Beautifulsoup doesn't return the whole html seen in inspectBeautifulsoup 不会返回检查中看到的整个 html
【发布时间】:2021-05-19 20:00:11
【问题描述】:

我正在尝试解析现场体育赛事结果网站的 html,但我的代码并未将所有跨度标签返回到该网站。我在检查下看到所有匹配项都是 ,但我的代码似乎无法从网站上找到除页脚或页眉之外的任何内容。也尝试过使用 div,但这些也不起作用。我是新手,有点迷路,这是我的代码,有人可以帮助我吗? 为了更清楚,我保留了 for 循环的第一部分。

#Creating the urls for the different dates
my_url='https://www.livescore.com/en/football/{}'.format(d1)
print(my_url)
today=date.today()-timedelta(days=i)
d1 = today.strftime("%Y-%m-%d/")

#Opening up the connection and grabbing the html
uClient=uReq(my_url)
page_html=uClient.read()
uClient.close()
#HTML parser
page_soup=soup(page_html,"html.parser")
spans=page_soup.findAll("span")
matches=page_soup.findAll("div", {"class":"LiveRow-w0tngo-0 styled__Root-sc-2sc0sh-0 styled__FootballRoot-sc-2sc0sh-4 eAwOMF"})
print(spans)

【问题讨论】:

    标签: python web-scraping beautifulsoup html-parsing


    【解决方案1】:

    现在假设你有正确的类来抓取,一个简单的循环就可以了:

    for i in soup.find_all("div", {"class":"LiveRow-w0tngo-0 styled__Root-sc-2sc0sh-0 styled__FootballRoot-sc-2sc0sh-4 eAwOMF"}):
        print(i)
    

    或将其添加到列表中:

    teams = []
    
    for i in soup.find_all("div", {"class":"LiveRow-w0tngo-0 styled__Root-sc-2sc0sh-0 styled__FootballRoot-sc-2sc0sh-4 eAwOMF"}):
            teams.append(i.text)
    print(teams)
    

    如果这不起作用,请运行一些测试以查看您是否真的在抓取正确的东西,例如打印一个单数的东西。

    另外,在您的代码中,我看到您打印的是“spans”而不是“matches”,这也可能是您的代码的问题。

    您还可以查看此post,其中进一步解释了如何执行此操作。

    【讨论】:

    • 是的,感谢列表建议,但不幸的是它不起作用,它返回一个空列表。可悲的是,我尝试了以上所有方法,但没有。是否有可能我在检查选项卡中看到的 html 代码对于漂亮的汤不完全可见?
    • 你有没有尝试抓取一个单一的东西只是为了看看它是否有效?您可能没有抓取正确的网站,这可能是问题所在。
    • 是的,它从页面的页脚返回 span/div 标签,而不是从显示匹配分数的部分返回。
    • 你能给我你正在抓取的链接吗?您是否正在寻找足球阵容?
    • livescore.com/en 这是该网站,我正在尝试通过 url 上的循环查找过去几天的分数,您可以在开头的代码中看到它。所以主要的想法是它需要一个日期并获得当天的所有足球结果,比如(主队名,客队名,主队得分,客队得分)
    【解决方案2】:

    页面是动态的,由 JS 渲染。当您发出请求时,您会在呈现之前获得静态 html 响应。对于这种情况,您可以做一些事情:

    1. 使用类似 Selenium 的东西来模拟浏览器操作。它会打开一个浏览器,转到该站点,允许该站点呈现页面。呈现页面后,您就可以获取该页面的 html,该页面将包含数据。它可以工作,但需要更长的时间来处理,因为它实际上是在模拟您手动执行的过程。
    2. 使用requests-HTML 包,它还允许呈现页面(我之前没有尝试过这个包,因为它与我的IDE Spyder 冲突)。这将类似于 Selenium,但没有实际打开浏览器。它本质上是 requests 包,但支持 javascript。
    3. 查看数据(在静态 html 响应中)是否以 json 格式嵌入到 <script> 标记中。有时您会在那里找到它,但需要做一些工作才能将其拉出并符合/操作为有效的 json 格式,以便使用json.loads() 读取
    4. 查找是否存在某种 api(检查 XHR)并直接从那里获取数据。

    如果可用,最好的选择总是#4。为什么?因为数据将是一致的结构。即使网站改变了它的结构或 css 改变(这会改变你解析的 html),输入它的底层数据也很少会改变它的结构。这个网站确实有一个 api 来访问数据:

    import requests
    import datetime
    
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}
    
    dates_list = ['20210214', '20210215', '20210216']
    
    for dateStr in dates_list:
        url = f'https://prod-public-api.livescore.com/v1/api/react/date/soccer/{dateStr}/0.00'
        dateStr_alpha = datetime.datetime.strptime(dateStr, '%Y%m%d').strftime('%B %d')
        response = requests.get(url, headers=headers).json()
        stages = response['Stages']
        for stage in stages:
            location = stage['Cnm']
            stageName = stage['Snm']
            events = stage['Events']
            print('\n\n%s - %s\t%s' %(location, stageName, dateStr_alpha))
            print('*'*50)
            for event in events:
                outcome = event['Eps']
                team1Name = event['T1'][0]['Nm']
                if 'Tr1' in event.keys():
                    team1Goals = event['Tr1']
                else:
                    team1Goals = '?'
                
                team2Name = event['T2'][0]['Nm']
                if 'Tr2' in event.keys():
                    team2Goals = event['Tr2']
                else:
                    team2Goals = '?'
                print('%s\t%s %s - %s %s' %(outcome, team1Name, team1Goals, team2Name, team2Goals))
    

    输出:

    England - Premier League        February 15
    ********************************************************************************
    FT      West Ham United 3 - Sheffield United 0
    FT      Chelsea 2 - Newcastle United 0
    
    
    Spain - LaLiga Santander        February 15
    ********************************************************************************
    FT      Cadiz 0 - Athletic Bilbao 4
    
    
    Germany - Bundesliga    February 15
    ********************************************************************************
    FT      Bayern Munich 3 - Arminia Bielefeld 3
    
    
    Italy - Serie A February 15
    ********************************************************************************
    FT      Hellas Verona 2 - Parma Calcio 1913 1
    
    
    Portugal - Primeira Liga        February 15
    ********************************************************************************
    FT      Sporting CP 2 - Pacos de Ferreira 0
    
    
    Belgium - Jupiler League        February 15
    ********************************************************************************
    FT      Gent 4 - Royal Excel Mouscron 0
    
    
    Belgium - First Division B      February 15
    ********************************************************************************
    FT      Westerlo 1 - Lommel 1
    
    
    Turkey - Super Lig      February 15
    ********************************************************************************
    FT      Genclerbirligi 0 - Besiktas 3
    FT      Antalyaspor 1 - Yeni Malatyaspor 1
    
    
    Brazil - Serie A        February 15
    ********************************************************************************
    FT      Gremio 1 - Sao Paulo 2
    FT      Ceara 1 - Fluminense 3
    FT      Sport Recife 0 - Bragantino 0
    
    
    Italy - Serie B February 15
    ********************************************************************************
    FT      Cosenza 2 - Reggina 2
    
    
    France - Ligue 2        February 15
    ********************************************************************************
    FT      Sochaux 2 - Valenciennes 0
    FT      Toulouse 3 - AC Ajaccio 0
    
    
    Spain - LaLiga Smartbank        February 15
    ********************************************************************************
    FT      Castellon 1 - Fuenlabrada 2
    FT      Real Oviedo 3 - Lugo 1
    
    
    ...
    
    
    Uganda - Super League   February 16
    ********************************************************************************
    FT      Busoga United FC 1 - Bright Stars FC 1
    FT      Kitara FC 0 - Mbarara City 1
    FT      Kyetume 2 - Vipers SC 2
    FT      UPDF FC 0 - Onduparaka FC 1
    FT      Uganda Police 2 - BUL FC 0
    
    
    Uruguay - Primera División: Clausura    February 16
    ********************************************************************************
    FT      Boston River 0 - Montevideo City Torque 3
    
    
    International - Friendlies  Women       February 16
    ********************************************************************************
    FT      Guatemala 3 - Panama 1
    
    
    Africa - Africa Cup Of Nations U20: Group C     February 16
    ********************************************************************************
    FT      Ghana U20 4 - Tanzania U20 0
    FT      Gambia U20 0 - Morocco U20 1
    
    
    Brazil - Amazonense: Group A    February 16
    ********************************************************************************
    Postp.  Manaus FC ? - Penarol AC AM ?
    

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 2015-01-02
    • 2017-06-02
    • 1970-01-01
    • 2019-01-08
    • 2018-11-24
    • 2019-03-12
    • 2015-07-07
    • 2019-03-11
    • 2023-03-18
    相关资源
    最近更新 更多