2017-07-19 38 views
0

我最近開始使用Scrapy,並試圖使用「XMLFeedSpider」來提取和加載xml頁面中的頁面。但問題是它返回一個錯誤:「IndexError:列表索引超出範圍」。如何使用scrapy從XML提取網址 - XMLFeedSpider?

我試圖收集和加載是在該地址的所有產品頁:
http://www.example.com/feed.xml

我的蜘蛛:

from scrapy.spiders import XMLFeedSpider 

class PartySpider(XMLFeedSpider): 
    name = 'example' 
    allowed_domains = ['http://www.example.com'] 

    start_urls = [  
     'http://www.example.com/feed.xml' 
    ] 

    itertag = 'loc' 

    def parse_node(self, response, node): 
     self.logger.info('Hi, this is a <%s> node!: %s', self.itertag,''.join(node.extract())) 
+0

請分享您的堆棧跟蹤,當你'IndexError:列表索引range' –

+0

當然的,我已經加入我的回溯。 – Pablo

回答

0

這是怎麼了你的XML輸入啓動:

<?xml version="1.0" encoding="UTF-8"?> 
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
<url><loc>http://www.example.htm</loc></url> 
<url><loc>http://www.example.htm</loc></url> 
(...) 

當在XML文檔中使用(默認)迭代器iternodes時,在XMLFeedSpider中出現了一個錯誤使用命名空間。請參閱scrapy-users郵件列表中的this archived discussion

這種蜘蛛的作品,使用前綴n改變迭代xml,在那裏你可以參考一個命名空間,在這裏http://www.sitemaps.org/schemas/sitemap/0.9(它可以是任何東西真的),並使用標籤來尋找,這裏n:loc這個命名空間前綴:

from scrapy.spiders import XMLFeedSpider 

class PartySpider(XMLFeedSpider): 
    name = 'example' 
    allowed_domains = ['example.com'] 

    start_urls = [  
     'http://www.example.com/example.xml' 
    ] 

    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')] 
    itertag = 'n:loc' 
    iterator = 'xml' 

    def parse_node(self, response, node): 
     self.logger.info('Hi, this is a <%s> node!: %s', self.itertag,''.join(node.extract())) 
+0

非常感謝Paul! – Pablo