格式化网站中的抓取数据(BeautifulSoup)

时间:2012-06-19 15:54:35

标签: python html-parsing web-scraping beautifulsoup

我正在使用BeautifulSoup和Requests创建一个刮刀,它会刮擦网站的页面以获得匹配计划(以及结果,如果有的话)。这就是我到目前为止所做的:

    def getMatches(self):
        url = 'http://icc-cricket.yahoo.net/match_zone/series/fixtures.php?seriesCode=ENG_WI_2012' # change seriesCode in URL for different series.
        page = requests.get(url)
        page_content = page.content
        soup = BeautifulSoup(page_content)

    result = soup.find('div', attrs={'class':'bElementBox'})
    tags = result.findChildren('tr')

    for elem in tags:
        x = elem.getText()
        print x

这些是我得到的结果:

Date & Time (GMT)fixture
Thu, May 17, 2012 10:00 AMEngland  vs  West Indies
3rd TESTA full scorecard will be available shortly.Venue: Edgbaston,    BirminghamResult: England won by 5 wickets
Fri, May 25, 2012 11:00 AMEngland  vs  West Indies
2nd TESTClick here for the full scorecardVenue: Trent Bridge, NottinghamResult:     England won by 9 wickets
Thu, Jun 7, 2012 10:00 AMEngland  vs  West Indies
1st TESTClick here for the full scorecardVenue: Lord'sResult: Match Drawn
Sat, Jun 16, 2012 9:45 AMEngland  vs  West Indies
1st ODIClick here for the full scorecardVenue: The Rose Bowl, SouthamptonResult:     England won by 114 runs (D/L Method)
Tue, Jun 19, 2012 9:45 AMEngland  vs  West Indies
2nd ODIVenue: KIA Oval
Fri, Jun 22, 2012 9:45 AMEngland  vs  West Indies
3rd ODIVenue: Headingley Carnegie
Sun, Jun 24, 2012 12:00 AMEngland  vs  West Indies
1st T20Venue: Trent Bridge, Nottingham

现在,我想以某种结构化格式对数据进行分类。一个dicts列表,每个包含
关于单个比赛的信息将是理想的。但我坚持如何实现这一目标。结果中的输出字符串包含&nbsp之类的字符,时间奇怪地排列为AMEngland。还有一个问题是,如果我使用空格字符作为分隔符来分割字符串,那么像西印度群岛这样有两个单词的国家将被拆分,并且没有任何统一的方法来解析它。

所以有一种方法可以统一解析这些数据,所以我可以进入表单。有点像:

[ {'date': match_date, 'home_team': team1, 'away_team': team2, 'venue': venue},{ same for match 2}, { match 3 }...]

我会感激任何帮助。 :)

2 个答案:

答案 0 :(得分:1)

将日期/时间与国家分开并不是很困难。你可以为“Venue”和“Result”做同样的事。

>>> import re
>>> s = "Sun, Jun 24, 2012 12:00 AMEngland  vs  West Indies"
>>> match = re.search(r"\b[AP]M", s)
>>> s[0:match.end()]
'Sun, Jun 24, 2012 12:00 AM'
>>> s[match.end():]
'England  vs  West Indies'

答案 1 :(得分:0)

请改为scrapy;它将使这项任务变得更加容易。

您定义items从该网站中删除:

from scrapy.item import Item, Field

class CricketMatch(Item):
    date = Field()
    home_team = Field()
    away_team = Field()
    venue = Field()

然后定义loader with XPath expressions来填充这些项目。之后,您可以直接使用这些项目,或produce JSON output or similar