xpath / css href不打印

时间:2016-01-04 18:05:12

标签: css ruby xpath nokogiri

我正在尝试打印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 / talent / pressurized-glands'

我能够在我的剧本中获得类似于早期工作的东西,但我没有运气。

1 个答案:

答案 0 :(得分:1)

节点选择器越长,它就越不可能正常工作,特别是如果你处理的是你无法控制的HTML。

减少它以找到方向点,帮助您向下钻取的位置,而不是尝试定义每个步骤。

您还依赖于选择器中的tbody。当我们看到它时,它不是原始HTML源代码而是由浏览器注入的几率很高。选择器喜欢使用浏览器和检查器来查找页面中的特定项目,但如果HTML实际上不包含tbody,则生成的路径将不起作用。浏览器会尝试提供一些有用的东西,包括添加标签。所以当你看到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和/或未在文档中其他位置复制的唯一标记模式。这些可以轻松减少选择器。有时我们必须逐步进入文档,就像我在查找特定节点后使用first或其中一个“兄弟”方法一样,但很少需要使用长选择器。