我正在尝试打印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
或其中一个"同级"方法那样逐步进入文档,但很少需要使用长选择器。