2012-06-19 5 views
0

Я создаю скребок с использованием BeautifulSoup и просит, чтобы скрестил страницы сайта, чтобы получить график соответствия (и результат, если он доступен). Это то, что я до сих пор:Форматирование скребковых данных с веб-сайта (BeautifulSoup)

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 

Теперь я хочу, чтобы классифицировать данные в каком-то определенном формате. Список диктов, каждый из которых содержит
, информация об одном матче была бы идеальной. Но я зациклился на том, как добиться этого. Выходные строки в результате имеют такие символы, как &nbsp, и время странно устроено как AMEngland. Также есть вопрос, что если я разделил строку с использованием символа пробела в качестве разделителя, такие страны, как Вест-Индия, с двумя словами, будут разделены, и не будет никакого единого способа проанализировать это.

Так что я могу равномерно разобрать эти данные, поэтому я могу получить форму. Kinda like:

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

Буду признателен за любую помощь. :)

ответ

1

Невозможно было отделить дату и время и страны. Вы можете сделать то же самое для «Место проведения» и «Результат».

>>> 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' 
+0

Большое спасибо. Думаю, глядя на HTML весь день заставил меня немного забыть, что я могу просто использовать простое регулярное выражение. :) –

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.

+0

Я действительно собирался пройти сеанс, но приложение, над которым я работаю, уже использует BeautifulSoup для существующих задач, поэтому мне сказали не использовать это. –

+0

Вы не указали это в своем вопросе, к сожалению. Также обратите внимание, что SO стремится иметь вопросы и ответы в целом полезными не только для отдельных случаев, поэтому я оставлю свой ответ на месте. –

Смежные вопросы