【问题标题】:Click Link within .each loop in Ruby Mechanize在 Ruby Mechanize 中单击 .each 循环内的链接
【发布时间】:2016-09-15 18:11:31
【问题描述】:

我正在编写一个脚本来爬取搜索结果页面,并且我创建了一个循环来查找正确的搜索结果,并且它有效。我遇到的问题是尝试单击 LI 元素中的链接的每一种排列方式都不起作用。起初我尝试在 LI 中找到锚点,但它是一个 nokogiri 对象,我尝试进入 @page 并向下钻取到正确的元素,但它返回为零。

有没有办法在我已经深入研究的 LI 元素中进行搜索?

require 'mechanize'
require 'nokogiri'
require 'csv'

@agent = Mechanize.new do |agent|
    agent.user_agent_alias = 'Mac Safari'
end
@page = @agent.get('https://www.milwaukeetool.com/search-results?FullTextKeywords=48-42-5540')

def resultsPageSearcher (searchText)
  @page.search('#results ul > li').each do |li|
    results_sku = li.css('span.results-sku').text
    if results_sku == searchText
            link = @page.link_with(:text => results_sku)
      @page = link.click
    end
  end
end

resultsPageSearcher("48-42-5540")

相关的 LI 元素(我删除了看起来不相关的无关代码,如有必要我可以添加更多我只是不想过度发布)

<li>
    <a href="/accessories/cutting/48-42-5540" class="results-image">
      <img src="//cdn.milwaukeetool.com/~/media/Images/Accessories/Cutting/48-42-5540/21867_48-42-5540.jpg?h=100&amp;thn=1&amp;w=100" alt=""></a>
    <a class="results-title" href="/accessories/cutting/48-42-5540">4" 10 TPI High-Carbon Steel Jig Saw Blade (5 PK)</a>            
    <span class="results-sku">48-42-5540</span>
</li>

【问题讨论】:

  • 你能提供更多关于它如何不起作用的细节吗?您是否看到特定错误?如果没有,你想得到什么结果,现在它给了你什么?
  • @StevenSchobert 它目前返回 NIL。这个版本的代码是我没有想法的地方,我不想去'@page',因为我遇到了深入到正确的 LI 元素的麻烦,我不知道如何找到仅该元素内的链接并单击它。
  • 欢迎来到 Stack Overflow。请阅读“How to Ask”及其链接页面和“minimal reproducible example”。您要求我们想象您尝试导航的 HTML。相反,将其减少到绝对的最低限度,并将其添加到适当格式化的问题中。这将帮助我们使用与您相同的输入来工作。此外,使用该 HTML 重新创建演示问题的最少代码。目前您的问题包含与任何内容无关的代码,我们将不得不拼凑 HTML 来测试这会浪费我们的时间。
  • @RyanStone 您是否尝试获取所有链接页面或仅在页面的某个子部分下的所有链接。
  • @TallPaul 只是小节。具体的用例是制造商没有提供我公司的产品数据,我需要一周的时间手动输入数据。我正在构建它来抓取和抓取数据。我正在输入零件号,另一个未显示的函数找到了正确的搜索结果 LI,我需要单击该元素中的链接。

标签: ruby nokogiri mechanize


【解决方案1】:

所以前几天我发现了一个非常酷的库,我认为它可以帮助你解决这个问题。它将转到您提供的链接,然后搜索包含您想要的文本的链接并单击它。如果您对此有任何疑问,请告诉我。

require 'watir'
require 'headless'
require 'csv'

headless = Headless.new
headless.start
browser = Watir::Browser.new
browser.goto('https://www.milwaukeetool.com/search-results?FullTextKeywords=48-42-5540')
browser.link(text: searchText).when_present.click

【讨论】:

  • 费了一番功夫,但我成功了,谢谢大家。
  • 很高兴我能指出你正确的方向!您应该编辑此答案以包含您可能不得不做的任何不同的事情
  • 不要编辑答案。保留它的回答。评论足以记录更改的内容。
  • 我将设置从 Mechanize 中切换出来,并按照建议使用了 Watir。 def resultsPageSearcher (searchText) results_sku = @browser.span(:class =&gt; 'results-sku') if results_sku.text == searchText results_sku.element(:xpath =&gt; './preceding-sibling::*[1]').click end end
猜你喜欢
  • 2012-07-23
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多