获取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_xpath
或at_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