使用Scrapy for XML页面

时间:2013-10-28 09:50:17

标签: python xml web-scraping scrapy

我正在尝试从API中抓取多个页面来练习和开发我的XML报废。出现的一个问题是,当我尝试抓取格式如下的文档:http://i.imgur.com/zJqeYvG.png并将其存储为XML时,它无法执行此操作。

因此,在CMD中,它会获取在我的计算机上创建XML文件的URL,但其中没有任何内容。

如何修复它以回显整个文档甚至部分内容?

我把代码放在下面:

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 个答案:

答案 0 :(得分:4)

您的XML文件使用名称空间“http://www.do-it.org.uk/volunteering-opportunity”,因此要选择titlename等,您有2个选择:

  • 使用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命名空间的更多详细信息,请参阅this page in the FAQthis page in the docs