使用Scrapy爬取XML页面

3
我想练习和开发XML爬虫,因此我正在尝试从API中抓取多个页面。但是遇到的一个问题是,当我试图从格式如下的文档中获取数据时:http://i.imgur.com/zJqeYvG.png ,并将其存储为XML时,它无法实现。

在CMD中,它会获取URL并在我的计算机上创建XML文件,但是里面什么也没有。

要如何修复它以回显整个文档或其中一部分?

以下是我的代码:

from scrapy.spider import BaseSpider
from scrapy.selector import XmlXPathSelector
from doitapi.items import DoIt
import random

class MySpider(BaseSpider):
    name = "craig"
    allowed_domains = ["do-it.org.uk"]
    start_urls = []
    number = []
    for count in range(100):
        number.append(random.randint(2000000,2500000))


    for i in number:
        start_urls.append("http://www.do-it.org.uk/syndication/opportunities/%d?apiKey=XXXXX-XXXX-XXX-XXX-XXXXX" %i)



       def parse(self, response):
    xxs = XmlXPathSelector(response)
    titles = xxs.register_namespace("d", "http://www.do-it.org.uk/volunteering-opportunity")
    items = []
    for titles in titles:
        item = DoIt()
        item ["url"] = response.url
        item ["name"] = titles.select("//d:title").extract()
        item ["description"] = titles.select("//d:description").extract()
        item ["username"] = titles.select("//d:info-provider/name").extract()
        item ["location"] = titles.select("//d:info-provider/address").extract()
        items.append(item)
    return items
1个回答

4
您的XML文件在使用命名空间"http://www.do-it.org.uk/volunteering-opportunity",因此要选择titlename等,您有两个选择:
  • 要么使用xxs.remove_namespaces()一次,然后使用.select("./title").select("./description")等。
  • 要么注册一个带有前缀“doit”的命名空间,xxs.register_namespace("doit", "http://www.do-it.org.uk/volunteering-opportunity"),然后使用.select("./doit:title").select("./doit:description")等。
有关XML命名空间的更多详细信息,请参见FAQ中的此页面文档中的此页面

谢谢!如果我看起来像个彻底的新手,对不起,这是我的第一个Python项目,也是我第一次从XML中抓取信息。我回家后会尝试这个。 - user2927435
嘿,不要感到抱歉 :) XML解析和命名空间并不是很直观,我们都在这里学习。很高兴你选择Scrapy作为你的第一个Python项目。 - paul trmbrth
我已经尝试使用您的代码和文档中的代码,但仍然没有运气,至少现在我得到了错误!哈哈,错误是“Spider error processing”。 - user2927435
exceptions.TypeError: 'NoneType' object is not iterable 是另一个常见的错误。 - user2927435
请提供完整的堆栈跟踪信息,同时提供一个XML文档示例会更有帮助,而不仅仅是截图。您可以使用gist.github.com或Pastebin。 - paul trmbrth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接