如何使用Scrapy为此表编码.CSS提取

时间:2014-07-29 22:21:02

标签: python scrapy

我在Windows Vista 64位上使用Python.org版本2.7 64位。我正在使用Scrapy构建一个递归的webscraper。以下是for循环,用于从下面链接的页面上的表中提取数据:

rows = sel.xpath('//table[@id="player-fixture"]//tbody//tr')

        for row in rows:

            print 'date:', "".join( row.css('.date::text').extract() ).strip()
            print 'result:', "".join( row.css('.result a::text').extract() ).strip()
            print 'team_home:', "".join( row.css('.team.home a::text').extract() ).strip()
            print 'team_away:', "".join( row.css('.team.away a::text').extract() ).strip()
            print 'info:', "".join( row.css('.info::text').extract() ).strip(), "".join( row.css('.info::attr(title)').extract() ).strip()
            print 'rating:', "".join( row.css('.rating::text').extract() ).strip()
            print 'incidents:', ", ".join( row.css('.incidents-icon::attr(title)').extract() ).strip()
            print '-'*40

http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney

我现在正在尝试从网站另一部分的不同格式的表中解析数据,但我正在努力研究如何为它编写.CSS代码。该表格可在此处找到:

http://www.whoscored.com/Teams/705/Archive/Israel-Maccabi-Haifa

此表第一个标签的HTML如下:

<table id="team-squad-stats-summary-grid" class="grid with-centered-columns hover">
            <thead>
                <tr>
                    <th class="sortable rank" data-property="Rank" data-default-sort-dir="asc" title="Rank">R</th>
                    <th class="sortable rgn" data-property="PlayerRegionCode" data-default-sort-dir="asc" title="Country"></th>
                    <th class="sortable pn" data-property="PlayerName" data-default-sort-dir="asc" title="Player Name">Name</th>
                    <th class="sortable pos" data-property="RealPosition" data-default-sort-dir="asc" title="Position">Pos</th>
                    <th class="sortable age" data-property="Age" data-default-sort-dir="asc" title="Age">Age</th>
                    <th class="sortable hg" data-property="Height" title="Height">cm</th>
                    <th class="sortable wg" data-property="Weight" title="Weight">kg</th>

                    <th class="sortable ap" data-property="GameStarted"  title="First Eleven (Substitute)">Apps</th>
                    <th class="sortable g" data-property="Goals" title="Goals">Goal</th>
                    <th class="in-squad-detailed-view  sortable a" data-property="Assists" title="Assists">A</th>
                    <th class="sortable y" data-property="Yellow" title="Yellow Cards">Yel</th>
                    <th class="sortable r" data-property="Red" title="Red Cards">Red</th>

                    <th class="in-squad-detailed-view sortable spg" data-property="TotalShots" title="Shots per Game">SpG</th>
                    <th class="in-squad-detailed-view sortable ps" data-property="PassSuccess" title="Pass success percentage">PS%</th>
                    <th class="in-squad-detailed-view sortable aw" data-property="AerialWon" title="Aerial duels won per game">AW</th>
                    <th class="in-squad-detailed-view sortable mom" data-property="ManOfTheMatch" title="Man of the Match">MoM</th>
                    <th class="in-squad-detailed-view sortable rating" data-property="Rating" title="Average Rating">Rt</th>    

                </tr>
            </thead>
            <tbody id="team-squad-stats-summary-content"></tbody>
            <tfoot>
                <tr>
                    <td colspan="99" class="info">*Players shaded are players who are not currently active in team. (Loaned, sold, etc..)</td>
                </tr>
            </tfoot>
        </table>
        </div>

我不确定我应该在这里使用HTML的哪些元素或.CSS中的语法。我尝试了以下方法,但它没有奏效:

for row in rows3:      

        rank = "".join( row.css('.rank::text').extract() ).strip() + ','
        playerregioncode = "".join( row.css('.playerregioncode a::text').extract() ).strip() + ','
        playername = "".join( row.css('.name::text').extract() ).strip() + ','
        realposition = "".join( row.css('.realposition::text').extract() ).strip() + ','
        age = "".join( row.css('.age:text').extract() ).strip() + ','
        height = "".join( row.css('.height::text').extract() ).strip() + ','

有人可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:0)

如果我是你,我只会在第808行解析DataStore(正如你在问题评论中提到的那样)。这已经是JSON格式。所以,对我来说,这里没有任何需要scrapy的需要。这就是我要做的事情:

  1. 以您喜欢的方式抓取页面的来源。出于某种原因,我无法使用requests获取源代码。它可能与您对问题的评论中提到的JS有关。但是,我能够在我的shell中发出以下命令并接收页面的来源。因此,使用subprocess从python中调用此函数或使用类似pycurl的内容。

    curl http://www.whoscored.com/Teams/705/Archive/Israel-Maccabi-Haifa

  2. DataStore.prime('stage-player-stat', defaultTeamPlayerStatsConfigParams.defaultParams ,的第一个索引和);的下一个索引之间查找文档中的文本。我们称这个字符串为data

  3. 将提取的字符串data加载到python词典数组中:

    jdata = json.loads(data)

  4. 现在我相信jdata将有一个字典数组,其中每个字典对应一个播放器。您可以使用这些词典中的每一个来访问原始问题中您正在寻找的玩家统计数据。