2015-04-20 13 views
3

下載樣式表,我通過下載的HTML頁面的一部分:如何分析/ 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> 
    ... 

和它們的命名可以更改。如何解析/下載樣式表的本地副本?

回答

3

事情是這樣的:

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 
+0

如果我把'/ path'改成'/ tmp' thyen,我得到'/usr/share/ruby/open-uri.rb:353:in'open_http':403 Forbidden(OpenURI :: HTTPError)'。如果我將'open'命令改爲'open(link [「href」],「User-Agent」=>「Mozilla/5.0(Windows NT 6.0; rv:12.0)Gecko/20100101 Firefox/12.0 FirePHP/0.7.1 「)'然後我得到'/usr/share/ruby/open-uri.rb:36:in'initialize':沒有隱式轉換爲字符串(TypeError)' –

+0

如果你需要設置標題,你將不得不使用Net :: HTTP或機械化或類似的東西。我不相信open-uri支持這一點。但我不認爲這與問題直接相關。 看到這個網絡:: HTTP示例與標題:http://stackoverflow.com/questions/587559/how-to-make-an-http-get-with-modified-headers – mrbrdo

+0

我剛剛嘗試與'wget'和它可以在沒有用戶代理字符串的情況下下載'css'文件。我認爲'head'中的一些其他鏈接(OP中未顯示)需要用戶代理。有沒有辦法讓你的腳本只下載css文件? –

1

我不是紅寶石專家,但你可以去在以下步驟

  • 您可以使用提供String類型解析並獲得.css文件名.scan(...)方法。 scan方法將返回一個數組樣式表文件名。查找scanhere
  • 然後更多信息下載和文件存儲與Net::HTTP.get(...)一個例子是here
+0

大部分的時間OpenUri將超過使用網絡最好: :HTTP因爲自動重定向和易用性。 –