我正在尝试使用nokogiri在<a>
HTML标签中获取href
值。
我想确定它们是路径,文件,URL甚至<div>
ID。
我目前的工作是:
hrefvalue = []
html.css('a').each do |atag|
hrefvalue << atag['href']
end
href
中的可能值可能是:
somefile.html
http://www.someurl.com/somepath/somepath
/some/path/here
#previous
是否有一种机制来识别该值是否是有效的完整URL,文件或路径或其他方法?
尝试uri:
require 'uri'
URI.parse('somefile.html').path
=> "somefile.html"
URI.parse('http://www.someurl.com/somepath/somepath').path
=> "/somepath/somepath"
URI.parse('/some/path/here').path
=> "/some/path/here"
URI.parse('#previous').path
=> ""
nokogiri通常与Ruby的URI或Open-uRi一起使用,因此,如果在您的情况下是这种情况,您将可以访问其方法。您可以使用它来试图解析URI(使用URI.parse
)。您通常也可以使用URI.join(base_uri, retrieved_href)
来构建完整的URL,只要您存储了base_uri。
(编辑/侧词:有关使用URI.join
的更多详细信息,请参见:https://stackoverflow.com/a/4864170/624590;请注意,将字符串作为参数而不是URI对象的URI.join
,而不是coerce必要)
基本上,要回答您的问题
是否有一种机制来识别该值是否是有效的完整 URL,文件或路径或其他?
如果已检索的_href和base_uri形成良好,并检索_href ==连接对,则是绝对路径。否则是相对的(同样,假设输入良好)。
如果您使用URI来解析HREF值,则将一些启发式方法应用于结果,则可以找出您想知道的内容。这基本上是浏览器即将发送页面或资源请求时要做的。
使用样品字符串:
%w[
somefile.html
http://www.someurl.com/somepath/somepath
/some/path/here
#previous
].each do |u|
puts URI.parse(u).class
end
导致:
URI::Generic
URI::HTTP
URI::Generic
URI::Generic
URI唯一认可为真正的http uri的人是" http://www.someurl.com/somepath/somepath/somepath"。所有其他人都缺少该方案&quot" http://"。(您还可以遇到更多的方案。有关更多信息,请参见规范。)
通用URI,您可以使用一些规则来整理它们,以便您知道如果必须打开它们,您将如何做出反应。
如果您通过刮擦页面来收集HREF字符串,则可以假设使用相同的方案并在相关URI提供的情况下使用相同的方案是安全的。因此,如果您最初加载了" http://www.someurl.com/index.html",则可以使用&quot" http://www.someurl.com/por;作为您的进一步请求的基础。
从那里看,看一下字符串内,以确定它们是锚定,绝对路径还是相对路径。如果字符串:
- 以
#
开头是一个锚点,将应用于当前页面而无需重新加载。 - 不包含路径定界符
/
,它是一个文件名,将添加到当前检索的URL中,替换文件名并检索。替代的一种很好的方法是使用File.dirname
,File.basename
和File.join
对字符串。 - 从路径定界符开始,这是一个绝对路径,用于替换原始URL中的路径。
URI::split
和URI::join
是您的朋友。 - 不是从路径定界符开始的,它是一个相对路径,并且与#2类似。 。
关于:
hrefvalue = []
html.css('a').each do |atag|
hrefvalue << atag['href']
end
我会改用它:
hrefvalue = html.search('a').map { |a| a['href'] }
但这只是我。
最终注意:URI与年龄有关,需要更新。这是一个有用的库,但对于重型Uri Rippin',我强烈建议您使用可寻址/URI。