gpt4 book ai didi

ruby-on-rails - 如何从 url 下载每个 zip 文件并使用 rails 解压缩

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:38 31 4
gpt4 key购买 nike

现在我有一个 URL,它在浏览器中填充了一个 .zip 文件列表。我正在尝试使用 Rails 下载文件,然后使用 rubyzip gem 中的 Zip::File 打开它们。目前,我正在使用 typhoeus gem 执行此操作:

response = Typhoeus.get("http://url_with_zip_files.com")

但是 response.response_body 是一个包含在字符串中的 HTML 文档。我是编程新手,所以使用最佳实践向正确的方向提示会很有帮助。

response.response_body => "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<html>\n <head>\n  <title>Index of /mainstream/posts</title>\n </head>\n <body>\n<h1>Index of /mainstream/posts</h1>\n<table><tr><th><a href=\"?C=N;O=D\">Name</a></th><th><a href=\"?C=M;O=A\">Last modified</a></th><th><a href=\"?C=S;O=A\">Size</a></th><th><a href=\"?C=D;O=A\">Description</a></th></tr><tr><th colspan=\"4\"><hr></th></tr>\n<tr><td><a href=\"/5Rh5AMTrc4Pv/mainstream/\">Parent Directory</a></td><td>&nbsp;</td><td align=\"right\">  - </td><td>&nbsp;</td></tr>\n<tr><td><a href=\"1476536091739.zip\">1476536091739.zip</a></td><td align=\"right\">15-Oct-2016 16:01  </td><td align=\"right\"> 10M</td><td>&nbsp;</td></tr>\n<tr><td><a href=\"1476536487496.zip\">1476536487496.zip</a></td><td align=\"right\">15-Oct-2016 16:04  </td><td align=\"right\"> 10M</td><td>&nbsp;</td></tr>"

最佳答案

要分解它,您需要:

  1. 使用 Typhoeus 获取初始 HTML 索引页

      base_url = "http://url_with_zip_files.com/"
    response = Typhoeus.get(base_url)
  2. 然后使用 Nokogiri 解析该 HTML 以提取 zip 文件的所有链接(参见:extract links (URLs), with nokogiri in ruby, from a href html tags?)

    doc = Nokogiri::HTML(response)
    links = doc.css('a').map { |link| link['href'] }
    links.map { |link| base_url + '/' + link}

    # Should look like:
    # links = ["http://url_with_zip_files.com/1476536091739.zip", "http://url_with_zip_files.com/1476536487496.zip" ...]

    # The first link is a link to Parent Directory which you should probably drop
    # looks like: "/5Rh5AMTrc4Pv/mainstream/"

    links.pop
  3. 一旦获得所有链接:然后访问所有提取的链接以使用 ruby​​ 下载 zip 文件并解压缩它们(参见:Ruby: Download zip file and extract)

     links.each do |link|
    download_and_parse(link)
    end

    def download_and_parse(zip_file_link)
    input = Typhoeus.get(zip_file_link).body
    Zip::InputStream.open(StringIO.new(input)) do |io|
    while entry = io.get_next_entry
    puts entry.name
    parse_zip_content io.read
    end
    end
    end

如果您想使用 Typhoeus 将文件内容从 url 流式传输到内存,请参阅标题为“流式传输响应正文”的 Typhoeus 文档部分。您还可以使用 Typhoeus 并行下载所有文件,这将提高您的性能。

关于ruby-on-rails - 如何从 url 下载每个 zip 文件并使用 rails 解压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40110213/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com