【问题标题】:How to parse/download stylesheet from HTML如何从 HTML 解析/下载样式表
【发布时间】:2015-06-26 23:19:11
【问题描述】:

我正在通过以下方式下载 HTML 页面的一部分:

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('https://example.com/index.html'))
wiki = doc./('//*[@id="wiki"]/div[1]')

我需要样式表才能正确显示它。它们包含在标题中,如下所示:

<!DOCTYPE html>
<html lang="en" class="">
    <head>
    ...
    <link href="https://example.com/9f40a.css" media="all" rel="stylesheet" />
    <link href="https://example.com/4e5fb.css" media="all" rel="stylesheet" />
    ...
  </head>
  ...

并且它们的命名可以更改。如何解析/下载样式表的本地副本?

【问题讨论】:

    标签: css ruby nokogiri


    【解决方案1】:

    类似这样的:

    require 'open-uri'
    doc.css("head link").each do |tag|
      link = tag["href"]
      next unless link && link.end_with?("css")
      File.open("/tmp/#{File.basename(link)}", "w") do |f|
        content = open(link) { |g| g.read }
        f.write(content)
      end
    end
    

    【讨论】:

    • 如果我将/path 更改为/tmp thyen 我得到/usr/share/ruby/open-uri.rb:353:in open_http': 403 Forbidden (OpenURI::HTTPError). If I change the open` 命令到open(link["href"], "User-Agent" =&gt; "Mozilla/5.0 (Windows NT 6.0; rv:12.0) Gecko/20100101 Firefox/12.0 FirePHP/0.7.1") 然后我得到@987654328 @initialize': 没有将 Hash 隐式转换为 String (TypeError)`
    • 如果您需要设置标头,您将不得不使用 Net::HTTP 或 Mechanize 或类似的东西。我不相信 open-uri 支持这一点。不过,我认为这与问题没有直接关系。请参阅带有标头的 Net::HTTP 示例:stackoverflow.com/questions/587559/…
    • 我刚刚尝试使用wget,它可以在没有用户代理字符串的情况下下载css 文件。我认为head 中的某些其他链接(OP 中未显示)可能需要用户代理。有没有办法让你的脚本只下载 css 文件?
    • 这正是它的作用。它下载 CSS 文件。就像我说的,如果您需要传递标头,请使用 Net::HTTP 而不是 open-uri (open)。
    • 我已将您的代码修改为仅下载 css 文件。您下载了所有链接,而不仅仅是 css。
    【解决方案2】:

    我不是红宝石专家,但您可以按照以下步骤进行操作

    • 您可以使用String类型提供的.scan(...)方法解析并获取.css文件名。 scan 方法将返回一个数组样式表文件名。在scan here 上查找更多信息
    • 然后下载并存储带有Net::HTTP.get(...)的文件,例如here

    【讨论】:

    • 大多数时候 OpenUri 比使用 Net::HTTP 更可取,因为它具有自动重定向和易用性。
    猜你喜欢
    • 2020-06-13
    • 2012-11-16
    • 1970-01-01
    • 2017-09-02
    • 2017-02-05
    • 2013-03-12
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多