加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何从Mechanize :: Page的搜索方法中获取Mechanize对象

发布时间:2020-12-17 02:43:11 所属栏目:百科 来源:网络整理
导读:我正在尝试抓取一个网站,我只能依靠类和元素层次结构来找到正确的节点.但是使用Mechanize :: Page#search返回Nokogiri :: XML :: Elements,我不能用它来填写和提交表单等. 我真的很想使用纯CSS选择器,但是对于类的匹配似乎也很简单,各种_with方法也是如此.但
我正在尝试抓取一个网站,我只能依靠类和元素层次结构来找到正确的节点.但是使用Mechanize :: Page#search返回Nokogiri :: XML :: Elements,我不能用它来填写和提交表单等.

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

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

解决方法

与声明的 in this answer一样,您可以使用通过Mechanize :: Page#search或Mechanize :: Page#at检索的Nokogiri :: XML :: Element构建一个新的Mechanize :: Form对象:

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.不完全是我想象的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读