【发布时间】:2015-06-20 23:14:12
【问题描述】:
我有一个很长的 CSS 选择器,它在实际用于 CSS、jQuery 等时工作得非常好。但是这个相同的选择器不适用于 Mechanize::Page 对象 - 它只是返回一个空数组。
选择器的目标是一个段落,在我的其他情况下是一个标题1。我还使用page.body 将我的页面结果转换为字符串,并且该元素肯定存在,但search(或at)方法不会返回任何内容。
这可能是什么原因?
我的代码如下所示:
agent = Mechanize.new
page = agent.get 'http://example.com'
page.search(source.read_more_selector).each do |read_more|
inner_page = agent.get(read_more['href'])
# displaying inner_page.body gives me a few valid HTML pages, but...
inner_page.search(source.inner_title_selector).each do |inner_content|
# but here, there's nothing here, inner_content is nil even though the selector should get us something back definitely
end
end
正常工作的 CSS 选择器 (source.inner_content_selector)
div#main-container-body > div#body-container > table > tbody > tr > td > span#ajaxprochoice > table > tbody > tr > td > table > tbody > tr > td > table > tbody > tr > td > div > h1.h1productHead
inner_page.body 的输出(众多循环结果之一。由于字符过多,此处无法添加):
所以上面的选择器应该绝对匹配 HTML 代码中的段落(当然,虽然它是一个 Mechanize::Page 对象,而不是一个字符串)和 inner_page.search,但事实并非如此。
我进入了实际的在线页面并打开了我的控制台并运行了这个简单的 jQuery 命令来尝试一下:
$('div#main-container-body > div#body-container > table > tbody > tr > td > span#ajaxprochoice > table > tbody > tr > td > table > tbody > tr > td > table > tbody > tr > td > div > h1.h1productHead').hide();
它奏效了!这几乎意味着选择器在这里有效。
编辑
当我添加这段代码时:
inner_page.at('.h1productHead').to_s
这给了我一个结果。但是当我使用完整的选择器时,它不会返回任何东西。为什么在这种情况下,Mechanize 对选择器不灵活?
【问题讨论】:
-
一个 html sn-p 和实际的选择器会很好。
-
我会尽快把它们放在这里。
-
您将 HTML 分配给
page,但随后您正在搜索inner_page。它还有助于查看确切的 URL 和 CSS 选择器。你真的在看example.com吗? -
正如我提到的,
inner_page确实返回有效页面。我已经对它们进行了分析,它们确实包含了我正在使用相同的选择器寻找的结果,但是它没有返回一些东西。read_more_selector查找a标签并获取它们的href属性,然后我们使用它来创建inner_page。我将很快添加代码示例 - 我发布此内容时已经很晚了。 -
@pguardiario 添加了示例代码。
标签: ruby css-selectors nokogiri mechanize