2011-03-25 50 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