使用Scrapy从XML中提取链接

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

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

我希望能够提取并跟踪<links>标签内的链接。

我只有默认代码:

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

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

但我不知道如何跟随 "text" 标签。我实际上尝试了 linkextractortags='links' 选项,但没有成功。日志有效地到达页面,获得了 200 的回复,但没有获取到任何链接。


在LinkExtractor中使用restrict_xpaths ='//link'来获取链接标签中的链接。 - Vaulstein
@Vaulstein:谢谢,但没有运气。如果我在Scrapy控制台中执行response.xpath("//item/link/text()").extract(),它确实会返回链接的文本,但如果在主代码中执行,它肯定不会跟随它们。 - Dervin Thunk
1
这里的关键问题是链接在元素文本中而不是属性中。链接提取器默认从href属性中提取链接,我认为它们被设计为从属性中获取链接,但我很确定你也可以指向文本。 - alecxe
@alecxe:我也这么想,我尝试使用LinkExtractor中的tags参数,但是我也无法获取链接列表。 - Dervin Thunk
@alecxe:不,谢谢 - Dervin Thunk
显示剩余2条评论
2个回答

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)

0
你应该使用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库中。 - Dervin Thunk

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