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/天才/加压腺体"

我能够在剧本的早期得到类似的作品,但我在这方面运气不佳。

节点选择器的时间越长,它正常工作的可能性就越小,尤其是在处理无法控制的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或其中一个"同级"方法那样逐步进入文档,但很少需要使用长选择器。

最新更新