首页 > 解决方案 > 使用 Scrapy 从网页的子链接中收集诗歌并将其放入 .txt 文件中

问题描述

我正在尝试从该站点http://amediavoz.com/上的“Índice general alfabético”类别下收集所有诗歌。那里出现了诗歌的标题,人们必须点击它才能找到实际的诗歌。基本上我想从这些页面中的每一个复制每首诗的所有文本(每个页面中的<p></p>xpath "/html/body/blockquote[2]/blockquote" 下的文本),除了关于这首诗的结尾信息<i></i>在HTML 代码。我想将所有内容保存在 .txt 文件中,要么一个大的,要么每页一个。

这段代码试图做到这一点。

import scrapy

class FirstSpider(scrapy.Spider):

    name = "FirstSpider"

    start_urls = ['http://amediavoz.com/']

    def start_requests(self):
        url = ['http://amediavoz.com/']
        yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        xp = "//a[@target='_blank']/@href"
        for url in response.xpath(xp).extract():
            page = response.url.split("/")[-2]
            filename = 'Poems=%s.txt' % page
            sub = url.css('blockquote')[1]
            with open(filename, 'wb') as f:
                f.write(sub.xpath('//font/text()').extract())
            self.log('Saved file %s' % filename)
            f.close()

当我运行代码时,我没有收到任何错误消息,但也没有输出,即文本文件。

任何帮助表示赞赏。

标签: pythonweb-scrapingscrapy

解决方案


抱歉,我不懂西班牙语。我只是粗略地提取文字,不一定对。如果你能标出需要从HTML中提取哪些数据,我会帮你修改代码。

from simplified_scrapy.spider import Spider, SimplifiedDoc
class FirstSpider(Spider):
  name = 'FirstSpider'
  start_urls = ['http://amediavoz.com/']
  refresh_urls = True

  def extract(self, url, html, models, modelNames):
    try:
      doc = SimplifiedDoc(html)
      if url['url']==self.start_urls[0]:
        lstA = doc.listA(url=url['url'],start='blockquote',end='La voz de los poetas')
        return [{"Urls":lstA}]

      blockquotes = doc.getElementsByTag('blockquote')
      page = url['url'].split("/")[-1]
      filename = 'data/Poems=%s.txt' % page
      with open(filename, 'w') as f:
        for blockquote in blockquotes:
          f.write(blockquote.getText('\n'))
          f.write('\n')
      print ('Saved file %s' % filename)
      return True
    except Exception as e:
      print ('extract',e)

from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(FirstSpider())# start scrapping

推荐阅读