如何从Mechanize :: Page的搜索方法获取Mechanize对象?

时间:2012-02-04 17:28:37

标签: ruby nokogiri mechanize-ruby

我正在尝试抓取一个网站,我只能依靠类和元素层次结构来找到正确的节点。但是使用Mechanize::Page#search会返回Nokogiri::XML::Element,我无法用它来填写和提交表单等。

我真的很想使用纯CSS选择器,但是使用各种_with方法对类的匹配似乎非常简单。但是,与简单地使用CSS选择器相比,:not(.class)之类的匹配非常冗长,而我不知道如何匹配元素层次结构。

有没有办法将Nokogiri元素转换回Mechanize对象,甚至可以直接从search方法中获取它们?

1 个答案:

答案 0 :(得分:7)

与陈述in this answer一样,您只需使用Mechanize::FormNokogiri::XML::Element检索到的Mechanize::Page#search来构建新的Mechanize::Page#at对象:

a = Mechanize.new
page = a.get 'https://stackoverflow.com/'

# Get the search form via ID as a Nokogiri::XML::Element
form = page.at '#search'

# Convert it back to a Mechanize::Form object
form = Mechanize::Form.new form, a, page

# Use it!
form.q = 'Foobar'
result = form.submit

注意:您必须向构造函数提供Mechanize对象和Mechanize::Page对象才能提交表单。否则它只是一个没有上下文的Mechanize::Form对象。


似乎没有中心效用函数将Nokogiri::XML::Element转换为Mechanize元素,而是在需要它们的地方实现转换。因此,编写一个通过CSS或XPath搜索文档并返回Mechanize元素的方法(如果适用)将需要在节点类型上使用相当大的switch-case。不完全是我想象的。