1

构建一个 webscraper 来抓取这个页面http://espn.go.com/nba/teams以便使用 scrapy python 库将所有​​团队名称及其对应的部门填充到数据库中。我正在尝试编写我的解析函数,但是我仍然不完全了解如何提取相应的部门名称以匹配每个团队。

[1] https://www.dropbox.com/s/jv1n49rg4p6p2yh/2014-12-29%2014.08.07-2.jpg?dl=0

def parse(self,response):
    items = []
    mex = "//div[@class='span-6']/div[@class='span-4']/div/div/div/div[2]/ul/li"
    i=0
    for sel in response.xpath(mex):
        item = TeamStats()
        item['team'] = sel.xpath(mex + "/div/h5/a/text()")[i]
        item['division'] = sel.xpath("//div[@class='span-6']/div[@class='span-4']/div/div/div/div[1]/h4")
        items.append(item)
        i=i+1
    return items

我的解析函数能够返回一个团队列表和一个列出所有部门的相应部门列表。现在我并不是真的如何指定确切的部门,因为在我看来,我必须从所选的团队名称导航(由 item['team'] = sel.xpath(mex + "/div/h5 /a/text()")[i] )通过使用前面的子关系(将包括一个我一直在关注的网站作为教程但我没有 10 个声誉点)来获取 DOM正确的划分,但我不知道如何写...

如果我在这方面走错了路,请告诉我,因为我不是 XPath 专家。实际上,我什至不确定是否需要一个计数器,就好像我删除了 [i] 然后我只得到了 30 个包含所有 30 个团队的列表。

4

1 回答 1

2

让我们让它更简单。

每个部门都div用一个mod-teams-list-medium类来表示。每个部门 div 由 2 个部分组成:

  • 具有 class="mod-header" 的 div 包含部门名称
  • 包含团队列表的 class="mod-content" 的 div

在您的蜘蛛内部,它将以这种方式反映:

for division in response.xpath('//div[@id="content"]//div[contains(@class, "mod-teams-list-medium")]'):
    division_name = division.xpath('.//div[contains(@class, "mod-header")]/h4/text()').extract()[0]
    print division_name
    print 

    for team in division.xpath('.//div[contains(@class, "mod-content")]//li'):
        team_name = team.xpath('.//h5/a/text()').extract()[0]

        print team_name
    print "------"

这是我在控制台上得到的:

Atlantic

Boston Celtics
Brooklyn Nets
New York Knicks
Philadelphia 76ers
Toronto Raptors
------
Pacific

Golden State Warriors
Los Angeles Clippers
Los Angeles Lakers
Phoenix Suns
Sacramento Kings
------
...
于 2014-12-30T18:53:07.587 回答