我正在尝试使用Mechanize从页面中搜索某些标签。我之前已成功使用Nokogiri来刮掉它们,但现在我正在尝试将它们组合成更广泛的Mechanize类。以下是Nokogiri声明:
page = Nokogiri::HTML(open(@model.url, "User-Agent" => request.env['HTTP_USER_AGENT']))
@model.icons = page.css("link[rel='apple-touch-icon']").to_s
这就是我认为的机械等价物,但它不起作用:
agent = Mechanize.new
page = agent.get(@model.url, "User-Agent" => request.env['HTTP_USER_AGENT'])
@model.icons = page.search("link[rel='apple-touch-icon']").to_s
第一个返回预期的<link rel="apple-touch-icon" etc etc..></link>
链接标记。第二个语句返回一个空字符串。如果我把to_s
放到最后,我得到一个超长输出。我认为这是一个错误或实际的Mechanize对象。
未转换为字符串时链接到长输出:https://gist.github.com/eadam/5583541
答案 0 :(得分:1)
如果没有示例HTML,则很难重新创建问题,因此这是一些可能对您有所帮助的一般信息。
“long output”是您使用inspect
方法时获得的Nokogiri :: NodeSet的search
输出。如果search
返回多个节点,或者节点有很多子节点,inspect
输出可以继续使用,但是,这就是它应该做的。
css
和search
非常相似,因为它们返回一个NodeSet。 css
假定传入的字符串是CSS访问器,而search
更通用,并试图确定传入的是CSS或XPath表达式。如果错误,则找到匹配的模式的可能性很小。您可以使用at
或search
为通用版,让Nokogiri将其弄清楚,或分别为at_css
,at_xpath
或css
和xpath
替换他们。 at
派生都返回第一个匹配的节点,类似于使用search('some_path').first
。
to_s
将NodeSet重新转换为传入的源代码。我更喜欢使用to_xml
,to_xhtml
或to_html
更明确。
为什么不像search
那样获得css
的输出?我不知道,因为我无法测试您正在解析的HTML。回答问题,例如数据处理,是GIGO的情况。