4

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

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

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

4

1 回答 1

7

就像在这个答案中所说的那样,您可以简单地使用通过或检索到的新Mechanize::Form对象:Nokogiri::XML::ElementMechanize::Page#searchMechanize::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::Elements 转换为 Mechanize 元素的中心效用函数,而是在需要的地方实现了转换。因此,编写一个通过 CSS 或 XPath 搜索文档并在适用时返回 Mechanize 元素的方法将需要在节点类型上使用相当大的 switch-case。跟我想象的不完全一样。

于 2012-02-05T14:28:35.263 回答