2011-03-25 101 views
3

我需要檢索HTML文檔中的文本文件的所有鏈接,我不知道這樣做的最佳方式是什麼,但是,我已經在ruby中嘗試了以下內容。 。收集所有鏈接到* .txt文件

line.scan(/<a href="([\w+:\/.-]*.txt)/) 

,但我不知道這是否表達涵蓋了所有可能的鏈接指向文本文件,如果有,我想知道一些內置的這個正則表達式?或者如果有人知道更好的方式來檢索一個巨大網頁中的文本文件的所有鏈接。

+2

使用DOM解析器來收集所有的鏈接,然後使用正則表達式查看所有鏈接的數組,以查找以'.txt'結尾的數組。不要使用一個正則表達式來執行這兩個任務。 – CanSpice 2011-03-25 23:28:16

回答

6

這將通過HTML走,找到所有的HREF帶有「.txt」擴展名:

#!/usr/bin/env ruby 

require 'nokogiri' 

html = <<EOT 
<html> 
    <head><title>foo</title></head> 
    <body> 
    <a href="file.txt">text file</a> 
    <a href="file.jpg">jpg file</a> 
    <a href="file2.txt">text file 2</a> 
    </body> 
</html> 
EOT 
doc = Nokogiri::HTML(html) 
puts doc.search('a').select { |n| n['href'][/\.txt$/] }.map{ |n| n['href'] } 

> file.txt 
> file2.txt 

它使用Nokogiri解析的內容,這確實是一個很大的防彈不是試圖用正則表達式。

+0

我試圖安裝引入nokogiri,但我得到一個錯誤: test21.rb:1:'需要':沒有這樣的文件來加載 - 引入nokogiri(LoadError) \t從test21.rb:1 但我有實際上安裝了gem:gem list | grep nokogiri nokogiri(1.4.4) – Flethuseo 2011-03-26 16:38:30

+0

你在Ruby <1.9?如果是這樣,在你需要任何寶石之前,你必須使用'require'rubygems''。 Ruby> 1.9會自動執行此操作。 – 2011-03-26 16:43:00

1

試試這個(捕獲所有txt文件,而不僅僅是鏈接):

html.scan(/[^\s"']+\.txt/) 

要捕獲鏈接的文本文件:

html.scan(/<a [^<>\n]*?href=["']([^\s"']+\.txt)["'][^<>\n]*?>.*?<\/a>/m) 
+0

如果文檔包含實際上不是鏈接的行'example.txt',該怎麼辦? – CanSpice 2011-03-25 23:45:36

+0

它也會捕捉到這一點。我將更新帖子 – 2011-03-25 23:50:04