获取Nokogiri中属性的值以提取链接URL

我有一个看起来像这样的文件:

 

我无法让Nokogiri得到href属性的值。 我想将地址作为字符串存储在Ruby变量中。

 html = < link  HTML doc = Nokogiri::HTML(html) doc.xpath('//div/a/@href') #=> [#] 

或者,如果你想更具体的div:

 >> doc.xpath('//div[@id="block"]/a/@href') => [#] >> doc.xpath('//div[@id="block"]/a/@href').first.value => "http://google.com" 
 doc = Nokogiri::HTML(open("[insert URL here]")) href = doc.css('#block a')[0]["href"] 

变量href被赋值给id为'block'元素内的元素的"href"属性的值。 doc.css('#block a')返回一个包含#block a属性的项目数组。 [0]以单个元素为目标,该元素是包含所有属性名称和值的哈希。 ["href"]以该哈希中的"href"键为目标并返回值,该值是包含url的字符串。

在以各种forms解决这个问题后,我决定自己写一个伪装成答案的教程。 它可能对其他人有帮助。

从这个片段开始:

 require 'rubygems' require 'nokogiri' html = < link1   HTML doc = Nokogiri::HTML(html) 

提取所有链接

我们可以使用xpath或css来查找所有元素,然后只保留具有href属性的元素:

 nodeset = doc.xpath('//a') # Get all anchors via xpath nodeset.map {|element| element["href"]}.compact # => ["http://google.com", "http://stackoverflow.com"] nodeset = doc.css('a') # Get all anchors via css nodeset.map {|element| element["href"]}.compact # => ["http://google.com", "http://stackoverflow.com"] 

但是有一种更好的方法:在上面的例子中, .compact是必要的,因为搜索也返回“只是一个书签”元素。 我们可以使用更精细的搜索来查找包含href属性的元素:

 attrs = doc.xpath('//a/@href') # Get anchors w href attribute via xpath attrs.map {|attr| attr.value} # => ["http://google.com", "http://stackoverflow.com"] nodeset = doc.css('a[href]') # Get anchors w href attribute via css nodeset.map {|element| element["href"]} # => ["http://google.com", "http://stackoverflow.com"] 

找到一个特定的链接

查找链接

 nodeset = doc.xpath('//div[@id="block2"]/a/@href') nodeset.first.value # => "http://stackoverflow.com" nodeset = doc.css('div#block2 a[href]') nodeset.first['href'] # => "http://stackoverflow.com" 

如果您知道自己只搜索一个链接,则可以使用at_xpathat_css代替:

 attr = doc.at_xpath('//div[@id="block2"]/a/@href') attr.value # => "http://stackoverflow.com" element = doc.at_css('div#block2 a[href]') element['href'] # => "http://stackoverflow.com" 

从相关文本中查找链接

如果您知道与链接相关联的文本并想要查找其url,该怎么办? 一个小的xpath-fu(或css-fu)派上用场:

 element = doc.at_xpath('//a[text()="link2"]') element["href"] # => "http://stackoverflow.com" element = doc.at_css('a:contains("link2")') element["href"] # => "http://stackoverflow.com" 

从链接中查找文本

如果您想查找与特定链接相关联的文本,该怎么办? 不是问题:

 element = doc.at_xpath('//a[@href="http://stackoverflow.com"]') element.text # => "link2" element = doc.at_css('a[href="http://stackoverflow.com"]') element.text # => "link2" 

有用的参考

除了广泛的Nokorigi文档之外 ,我在编写本文时遇到了一些有用的链接:

  • 一个方便的Nokogiri备忘单
  • 使用Nokogiri解析HTML的教程
  • 交互式测试CSS选择器查询
 doc = Nokogiri::HTML("HTML ...") href = doc.css("div[id='block'] > a") result = href['href'] #http://google.com 
 data = '   link1 link2 link3  ' 

以下是我尝试上面的HTML代码示例:

 doc = Nokogiri::HTML(data) doc.xpath('//@href').map(&:value) => [https://example.com/9f40a.css, https://example.com/4e5fb.css, https://example.com/5s5fb.css]