2012-03-27 79 views
0

我一直在通過教程,適應它到我想實現的項目。我似乎有什麼問題,我只是無法找到錯誤。建議提取// td文本和數字

當使用'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 
+0

你試過BeautifulSoup?這是一個更多的手冊,但你可能可以得到更多的控制,這樣 – 2012-03-27 01:53:07

+0

不,但也許如果這不起作用,我會的。 – sayth 2012-03-27 02:48:16

+0

@PreetKukreti事實證明,scrapy可以使用beautifulsoup以及http://doc.scrapy.org/en/latest/topics/spiders.html – sayth 2012-03-27 11:13:09

回答

2

我不太明白你的問題,但這裏是一個起點,國際海事組織(沒有測試過,看到一些代碼註釋):

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 

UPDATE:

//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功能可能無法正常工作。

參見:

+0

如何找到像這樣的行的額外信息行= hxs.select( '// table [@ class =「tabler」// tr [starts-with(@class,「r」)]')來自教程,不明顯,那就是我會做的。 – sayth 2012-03-27 05:52:41

+1

這是一個xpath問題,與scrapy無關。我不認爲scrapy文檔有這個。查看我的更新。我也爲你的問題添加了[tag:xpath]標籤。 – warvariuc 2012-03-27 06:02:37

+0

我收到此錯誤與Xpath選擇器引發ValueError(「無效XPath:%s」%xpath) \t exceptions.ValueError:無效的XPath:// table [@ class =「tabler」// tr [starts-with(@ (@ class,「r」)] – sayth 2012-03-27 06:03:47