3

使用 Mechanize,是否可以在页面的 HTML 中找到一个短语,例如“电子邮件”,然后找到下一个<input*,然后填写该输入字段,并且只填写该字段?

4

3 回答 3

4

Mechanize 在内部使用 Nokogiri 来处理其 DOM 解析,这是其在页面中定位不同元素的能力的基础。

可以访问已解析的 DOM,并且通过它使用 Nokogiri 来定位 Mechanize 通常不会让我们找到的元素。例如:

require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.example.com')

# Use Nokogiri to find the content of the <h1> tag...
puts page.at('h1').content # => "Example Domain"

对于您的搜索,您需要使用 XPath 访问器来定位“电子邮件”在页面中的位置。完成后,您可以找到下一个<input>标签。

从一个简单的 HTML 片段开始,我们假设它来自 Mechanize:

page = Nokogiri::HTML('<div><form><p>email</p><input name="email"></form></div>')
puts page.to_html

看起来像:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div><form>
<p>email</p>
<input name="email">
</form></div></body></html>

搜索“电子邮件”:

page.at("//*[contains(text(),'email')]")
#<Nokogiri::XML::Element:0x3ff50d0c4bc0 name="p" children=[#<Nokogiri::XML::Text:0x3ff50d0c497c "email">]>

在此基础上,得到<input>标签:

input_tag = page.at("//*[contains(text(),'email')]/following-sibling::input")
#<Nokogiri::XML::Element:0x3ff50d09b75c name="input" attributes=[#<Nokogiri::XML::Attr:0x3ff50d09b5f4 name="name" value="email">]>

找到输入标签后,您可以使用 Nokogiri 从标签中获取“名称”,然后告诉 Mechanize 定位并填写该特定输入字段:

input_tag['name']
=> "email"

要使 Web 表单正常运行,它必须具有元素的名称。这些在提交表单时被传递到服务器。如果没有名称,则需要大量工作才能确定哪个输入发送了特定的数据,而且程序员很懒惰,我们不想努力工作,因此您可以指望有一个名称可以使用。

有关更多信息,请参阅“ Ruby Mechanize、Nokogiri 和 Net::HTTP ”,以及对 Stack Overflow 的搜索,阅读Nokogiri 文档和教程将为您提供大量所需的信息,以了解如何完成其​​余工作。

于 2013-03-29T05:16:25.857 回答
2

首先找到带有短语文本的元素:

el = page.at('*[text()*="some phrase"]')

从那里您可以获得以下第一个输入:

input = el.at('./following::input')

现在,找到该输入的祖先表单节点:

form_node = input.ancestors('form')[0]

然后使用它来获取 Mechanize::Form 对象

form = page.form_with(:form_node => form_node)

现在您可以填写值

form[input[:name]] = 'foo'
于 2013-03-29T08:22:35.960 回答
1

对于格式良好的HTML 页面,一个input元素应该有一个label显示input它的用途。在这种情况下,您可以遍历 all label,找到包含 text的那个,并通过 的属性"email"获取关联。inputforlabel

然而,并不是所有的 HTML 页面都是格式良好的。不label,没有for属性,或其他格式不正确的问题。

如果您指的input是 DOM 中某个元素之后的右侧。您可以进行一些 DOM 遍历来查找包含元素"email"input元素旁边是否有元素。

如果您的意思是input呈现页面中元素的旁边,您应该定义什么是“旁边”。而且我认为如果不付出很大的努力,您将无法获得想要的东西。某些位于元素“email”之后的元素可能会通过一些 CSS 技巧放置在它之前。您需要一些图形 API 来找到它inputwatir但是,我在的 API 文档中没有看到这一点。

于 2013-03-29T04:24:57.813 回答