我正在尝试打印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'
我能够在我的剧本中获得类似于早期工作的东西,但我没有运气。
答案 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
或其中一个“兄弟”方法一样,但很少需要使用长选择器。