【问题标题】:Extracting links from xml using scrapy使用scrapy从xml中提取链接
【发布时间】:2015-12-12 16:56:14
【问题描述】:

我有一个具有以下结构的 xml 页面:

<item>
  <pubDate>Sat, 12 Dec 2015 16:35:00 GMT</pubDate>
  <title>
   some text
  </title>
  <link>
     http://www.example.com/index.xml
  </link>
  ...

我想提取并关注 &lt;links&gt; 标记内的链接。

我只有默认代码:

start_urls = ['example.com/example.xml']

rules = (
    Rule(LinkExtractor(allow="example.com"),
          callback='parse_item',),
)

但我不知道如何遵循“文本”标签。我实际上已经尝试过 linkextractor tags='links' 选项,但无济于事。日志有效地进入页面,得到 200 回复,但没有得到任何链接。

【问题讨论】:

  • LinkExtractor中使用restrict_xpaths='//link'从链接标签中获取链接
  • @Vaulstein:谢谢,但运气不好。如果我在scrapy控制台上response.xpath("//item/link/text()").extract()',它确实会返回链接的文本,但如果它在主代码中这样做,它肯定不会关注它们。
  • 这里的关键问题是链接在元素文本中而不是属性。链接提取器默认从href 属性中提取链接,我认为它们旨在从属性中获取链接,但我很确定您可以指向文本。
  • @alecxe:我也是这么想的,我尝试在LinkExtractor中使用tags参数,但我也没有得到链接列表
  • @DervinThunk 如果以前没有人提供有效的答案,我一定会稍后再看看。谢谢。

标签: python scrapy


【解决方案1】:

这里的关键问题是这不是一个常规的 HTML 输入,而是一个 XML 提要和链接,在元素文本中,而不是属性。我想你只需要 XMLFeedSpider 这里:

import scrapy
from scrapy.spiders import XMLFeedSpider

class MySpider(XMLFeedSpider):
    name = 'myspider'
    start_urls = ['url_here']

    itertag = "item"

    def parse_node(self, response, node):
        for link in node.xpath(".//link/text()").extract():
            yield scrapy.Request(link.strip(), callback=self.parse_link)

    def parse_link(self, response):
        print(response.url)

【讨论】:

    【解决方案2】:

    您应该使用 xml.etree 库。

    import xml.etree.ElementTree as ET
    
    
    
    res = '''
    <item>
      <pubDate>Sat, 12 Dec 2015 16:35:00 GMT</pubDate>
      <title>
       some text
      </title>
      <link>
         http://www.example.com/index.xml
      </link>
    </item>
    '''
    
    root = ET.fromstring(res)
    results = root.findall('.//link')
    for res in results:
        print res.text
    

    输出如下:

    http://www.example.com/index.xml
    

    【讨论】:

    • 谢谢。我确实得到了链接,我只是没有关注它们。此外,我看到你正在使用 lxml,我想留在 scrapy 库中进行学习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多