【问题标题】:scraping arXiv xml data with Scrapy使用 Scrapy 抓取 arXiv xml 数据
【发布时间】:2011-12-31 03:33:22
【问题描述】:

我正在尝试使用 scrapy 从 arXiv 的页面获取信息,但无法从他们的 xml page 中选择“项目”:

from scrapy.spider import BaseSpider
from scrapy.selector import XmlXPathSelector

class arXivSpider(BaseSpider):
    name = "arxiv"
    allowed_domains = ["arxiv.org"]
    start_urls = ["http://export.arxiv.org/rss/hep-th/recent"]

    def parse(self, response):
        xxs = XmlXPathSelector(response)
        papers = xxs.select('//item')
        print papers

item 对象非常简单,如果我可以提取它的话...

<item rdf:about="http://arxiv.org/abs/1112.5754">
<title>blah blah ... blah</title>
<link>http://arxiv.org/abs/1112.5754</link>
<description rdf:parseType="Literal"><p>...</p></description>
<dc:creator>blah, blah blah</dc:creator>
</item>

脚本运行完美,它只是papers = [],所以蜘蛛没有收集item 的。它可能需要使用命名空间...

【问题讨论】:

  • 您是否收到任何错误消息?编译错误?运行时错误?
  • 它运行......它的“论文”变量只是空数组[]

标签: python xml screen-scraping scrapy


【解决方案1】:

它可能需要使用命名空间...

是的。

XmlXPathSelector 能够通过注册命名空间 (examples in documentation) 来处理它们。在你的情况下:

$ scrapy shell http://export.arxiv.org/rss/hep-th/recent
In [1]: xxs.register_namespace('g', 'http://purl.org/rss/1.0/')

In [2]: xxs.namespaces
Out[2]: {'g': 'http://purl.org/rss/1.0/'}

In [3]: xxs.select('//item')
Out[3]: []

In [4]: xxs.select('//g:item')
Out[4]:
[<XmlXPathSelector xpath='//g:item' data=u'<item xmlns="http://purl.org/rss/1.0/" x'>,
 <XmlXPathSelector xpath='//g:item' data=u'<item xmlns="http://purl.org/rss/1.0/" x'>,
...

【讨论】:

  • 尝试 xxs.namespaces 时出现错误,我使用的是 scrapy 0.14。其他步骤适用于示例 arxiv 示例。
  • namespaces 属性仅适用于 lxml 后端。如果您使用的是 libxml2,您将不会拥有它。 lxml 后端的另一件重要事情是,在进行任何选择调用之前,您必须执行 register_namespace。在第一次选择之后,命名空间集被冻结,任何对 register_namespace 的进一步调用都将被丢弃......
【解决方案2】:

我认为你应该尝试在你的 scrapy shell 中进行实验。 1.scrapy shell 'http://export.arxiv.org/rss/hep-th/recent'

  1. sel.remove_namespaces()

  2. a = sel.xpath('//title/text()')

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多