xpath/css href 未打印

xpath/css href not printing

我正在尝试打印 html 文档的 href,但是我做不到。

newurl = 'http://www.heroesfire.com/hots/guide/the-many-ways-of-abathur-1194'
    buildpage = Nokogiri::HTML(open(newurl))
        #puts buildpage
        thistext = buildpage.css("div#wrap div#site-content.self-clear div#guide.view-guide div.col-l div.tab-contents.box div.guide-tab div.chapter-text div.text table.bbcode_columns tbody tr td.bbcode_column a").each do |href|
          puts href['href']
        end

我期待看到“/hots/wiki/talents/pressurized-glands”

我能够在我的脚本中获得类似于工作的东西,但我对此的运气为零。

不变的是,节点选择器越长,它正常工作的可能性就越小,尤其是当您处理无法控制的 HTML 时。

减少它以找到 way-points 可以帮助您向下钻取而不是试图定义每个步骤的地方。

您还依赖于选择器中的 tbody。当我们看到它时,很有可能它不在原始 HTML 源代码中,而是由您的浏览器注入的。选择器喜欢使用浏览器和检查器在页面中定位特定项目的味道,但如果 HTML 实际上不包含 tbody,则生成的路径将不起作用。浏览器做了很多 fix-up 来尝试展示一些有用的东西,包括添加标签。所以当你看到 tbody 并确认它确实存在时要小心。在您的情况下,确实如此,但在浏览文档时问题仍然存在。

简化路径的一个简单例子是:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
  <div id="foo">
    <div id="bar">
      <p>text1</p>
    </div>
    <div id="baz">
      <p>text2</p>
    </div>
  </div>
  </body>
</html>
EOT

doc.at('body div#foo div#bar p').text # => "text1"

可以更容易地编写,同时仍然完成同样的事情,使用:

doc.at('#bar p').text # => "text1"

或者其中之一:

doc.at('#foo div p').text # => "text1"
doc.search('#foo div p').first.text # => "text1"

所有抓取至少需要对目标页面的结构有一些预先了解,因此,当您四处寻找时,请注意重要的布局标签。 id 参数特别有用,后面跟着 class and/or 独特的标签模式,未在文档的其他地方复制。这些使得减少选择器变得容易。有时我们必须像我在定位特定节点后使用 first 或 "sibling" 方法之一那样逐步进入文档,但很少需要使用长选择器。