如何在HREF中识别路径/文件/URL



我正在尝试使用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;作为您的进一步请求的基础。

从那里看,看一下字符串内,以确定它们是锚定,绝对路径还是相对路径。如果字符串:

  1. #开头是一个锚点,将应用于当前页面而无需重新加载。
  2. 不包含路径定界符/,它是一个文件名,将添加到当前检索的URL中,替换文件名并检索。替代的一种很好的方法是使用File.dirnameFile.basenameFile.join对字符串。
  3. 从路径定界符开始,这是一个绝对路径,用于替换原始URL中的路径。URI::splitURI::join是您的朋友。
  4. 不是从路径定界符开始的,它是一个相对路径,并且与#2类似。

关于:

hrefvalue = []
html.css('a').each do |atag|
        hrefvalue << atag['href']
end

我会改用它:

hrefvalue = html.search('a').map { |a| a['href'] }

但这只是我。

最终注意:URI与年龄有关,需要更新。这是一个有用的库,但对于重型Uri Rippin',我强烈建议您使用可寻址/URI。

相关内容

  • 没有找到相关文章

最新更新