【问题标题】:Extracting Web Data Using Beautiful Soup (Python 2.7)使用 Beautiful Soup (Python 2.7) 提取 Web 数据
【发布时间】:2017-11-20 19:19:04
【问题描述】:

在下面的代码示例中,我尝试按预期抓取返回值的 5 个元素中的 3 个。 2(进球得分和助攻)不返回任何值。我已经验证了网页上确实存在数据并且我使用了正确的属性,但不确定为什么没有返回结果。有什么明显的我忽略了吗?

import sys
from bs4 import BeautifulSoup as bs
import urllib2 
import datetime as dt
import time
import pandas as pd

proxy_support = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_support)

player_name=[]
club =[]
position = []
goals_scored = []
assists = []

for p in range(25):
player_url = 'http://www.mlssoccer.com/stats/season?page={p}&franchise=select&year=2017&season_type=REG&group=goals'.format( 
        p=p) 
page = opener.open(player_url).read() 
player_soup = bs(page,"lxml") 
print >>sys.stderr, '[{time}] Running page {n}...'.format( 
        time=dt.datetime.now(), n=p) 
length = len(player_soup.find('tbody').findAll('tr'))

for row in range(0, length):
    try:
        name = player_soup.find('tbody').findAll('td', attrs={'data-title': 'Player'})[row].find('a').contents[0]
        player_name.append(name)
        team = player_soup.find('tbody').findAll('td', attrs={'data-title': 'Club'})[row].contents[0]
        club.append(team)
        pos = player_soup.find('tbody').findAll('td', attrs={'data-title': 'POS'})[row].contents[0]
        position.append(pos)
        goals = player_soup.find('tbody').findAll('td', attrs={'data-title': 'G' ,'class': 'responsive'})[row].contents[0]
        goals_scored.apppend(goals)
        a = player_soup.find('tbody').findAll('td', attrs={'data-title': 'A'})[row].contents[0]
        assists.append(a)
    except:
        pass    

player_data = {'player_name':player_name,
'club':club,
'position' : position,
'goals_scored' : goals_scored,
'assists' : assists,
 } 

df = pd.DataFrame.from_dict(player_data,orient='index')

df

我唯一能弄清楚的是,对于不返回数据的变量,HTML 中存在细微差别。我需要在我的代码中包含 class= responsive 吗?如果是这样,有什么例子可以说明它的外观吗?

定位 HTML : F

目标 HTML:11

感谢任何见解

【问题讨论】:

    标签: python python-2.7 web-scraping beautifulsoup


    【解决方案1】:

    您可以尝试这样来获取您想要的数据。我只解析了你需要的部分。剩下的你可以为数据框做。仅供参考,有两种类型的类附加到不同的 td 标签。 oddeven。不要忘记考虑这一点。

    from bs4 import BeautifulSoup
    import requests
    
    page_url = "https://www.mlssoccer.com/stats/season?page={0}&franchise=select&year=2017&season_type=REG&group=goals"
    for url in [page_url.format(p) for p in range(5)]:
        soup = BeautifulSoup(requests.get(url).text, "lxml")
        table = soup.select("table")[0]
        for items in table.select(".odd,.even"):
            player = items.select("td[data-title='Player']")[0].text 
            club = items.select("td[data-title='Club']")[0].text
            position = items.select("td[data-title='POS']")[0].text
            goals = items.select("td[data-title='G']")[0].text
            assist = items.select("td[data-title='A']")[0].text
            print(player,club,position,goals,assist)
    

    部分结果如下:

    Nemanja Nikolic CHI F 24 4
    Diego Valeri POR M 21 11
    Ola Kamara CLB F 18 3
    

    由于我在脚本中包含了这两个类,因此您将从该站点获取所有数据。

    【讨论】:

    • 感谢您的投入和时间。这完美地工作。我喜欢您的解决方案如何压缩和简化代码。我不知道 .odd 和 .even 标签的问题,所以感谢您的指点!
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 2018-05-30
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多