提取// td文本和数字的建议

时间:2012-03-27 01:48:00

标签: python xpath scrapy

我一直在完成教程,使其适应我想要实现的项目。我似乎遇到了一些问题,我无法找到错误。

当使用'scrapy shell'时,我可以得到我期望的响应。所以对于这个网站Nrl Ladder

In [1]: hxs.select('//td').extract()
Out[1]: 
[u'<td>\r\n<div id="ls-nav">\r\n<ul><li><a href="http://www.nrlstats.com/"><span>Home</span></a></li>\r\n<li class="ls-nav-on"><a href="/nrl"><span>NRL</span></a></li>\r\n<li><a href="/nyc"><span>NYC</span></a></li>\r\n<li><a href="/rep"><span>Rep Matches</span></a></li>\r\n\r\n</ul></div>\r\n</td>',
 u'<td style="text-align:left" colspan="5">Round 4</td>',
 u'<td colspan="5">Updated: 26/3/2012</td>',
 u'<td style="text-align:left">1. Melbourne</td>',
 u'<td>4</td>',
 u'<td>4</td>',
 u'<td>0</td>',
 u'<td>0</td>',
 u'<td>0</td>',
 u'<td>122</td>',
 u'<td>39</td>',
 u'<td>83</td>',
 u'<td>8</td>',
 u'<td style="text-align:left">2. Canterbury-Bankstown</td>',

就这样。

我真的很难理解如何改变教程项目以将其更改为不同的数据类型。

无论如何都要提出帮助或文档列表,以便在使用“td”或任何其他项目时查看我应该在项目中使用哪些类型。就像我说它在shell中很容易但我无法将其转换为文件。具体而言,团队名称和积分都是“td”,但团队名称是文本。

这就是我所做的。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from nrl.items import NrlItem

class nrl(BaseSpider):
    name = "nrl"
    allowed_domains = ["http://live.nrlstats.com/"]
    start_urls = [
        "http://live.nrlstats.com/nrl/ladder.html",
        ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//td')
        items = []
        for site in sites:
           item = nrlItem()
           item['team'] = site.select('/text()').extract()
           item['points'] = site.select('/').extract()
           items.append(item)
        return items

1 个答案:

答案 0 :(得分:2)

我不太明白你的问题,但这里是一个起点,imo(尚未测试;请参阅代码中的一些注释):

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from nrl.items import NrlItem

class nrl(BaseSpider):
    name = "nrl"
    allowed_domains = ["live.nrlstats.com"] # domains should be like this
    start_urls = [
        "http://live.nrlstats.com/nrl/ladder.html",
        ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        rows = hxs.select('//table[@class="tabler"]//tr[starts-with(@class, "r")]') # select team rows
        items = []
        for row in rows:
           item = nrlItem()
           columns = row.select('./td/text()').extract() # select columns for the selected row
           item['team'] = columns[0]
           item['P'] = int(columns[1])
           item['W'] = int(columns[2])
           ...
           items.append(item)
        return items

更新:

//table[@class="tabler"//tr[starts-with(@class, "r")]是一个xpath查询。查看一些xpath examples here

hxs.select(xpath_query)始终返回属于给定查询的节点列表(类型HtmlXPathSelector)。

hxs.extract()返回节点的字符串表示。

P.S。请注意scrapy支持XPath 1.0,但不支持2.0(至少在Linux上,不确定Windows),因此一些最新的xpath功能可能无效。

另见: