【问题标题】:Scraping a webpage with Mechanize and Nokogiri and storing data in XML doc使用 Mechanize 和 Nokogiri 抓取网页并将数据存储在 XML 文档中
【发布时间】:2015-05-31 17:45:47
【问题描述】:

我正在尝试使用 Mechanize 和 Nokogiri 抓取网站并将数据存储在 XML 中。我没有建立 Rails 项目,我只使用 Ruby 和 IRB。

我写了这个方法:

def mechanize_club
    agent = Mechanize.new
    agent.get("http://www.rechercheclub.applipub-fft.fr/rechercheclub/")
    form = agent.page.forms.first
    form.field_with(:name => 'codeLigue').options[0].select
    form.submit
    page2 = agent.get('http://www.rechercheclub.applipub-fft.fr/rechercheclub/club.do?codeClub=01670001&millesime=2015')
    body = page2.body
    html_body = Nokogiri::HTML(body)
    codeclub = html_body.search('.form').children("tr:first").children("th:first").to_i
    @codeclubs << codeclub
    filepath  = '/davidgeismar/Documents/codeclubs.xml'
    builder   = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
       xml.root {
          xml.codeclubs {
            @codeclubss.each do |c|
              xml.codeclub {
                xml.code_   c.code
              }
            end
          }
        }
    end
    puts builder.to_xml
  end

我的第一个问题是我不知道如何测试我的代码。 我在控制台中调用ruby webscraper.rb,我认为该文件已被处理,但它不会在指定路径中创建 XML 文件。 然后,更具体地说,我很确定这段代码是错误的,因为我没有机会测试它。

基本上我要做的是多次提交表单:

 agent = Mechanize.new
      agent.get("http://www.rechercheclub.applipub-fft.fr/rechercheclub/")
      form = agent.page.forms.first
      form.field_with(:name => 'codeLigue').options[0].select
      form.submit

我认为这段代码还可以,但我不希望它只选择options[0],我希望它选择一个选项,然后抓取我需要的所有数据,然后返回页面,然后选择options[1]。 .. 直到没有更多选择(我猜是迭代)。

【问题讨论】:

  • 我在任何地方都看不到问号。这通常很好地表明您实际上并没有在问问题。
  • 如何测试我的代码?

标签: ruby xml web-scraping nokogiri mechanize


【解决方案1】:

我认为该文件已被处理,但它不会在指定路径中创建 xml 文件。

您的代码中没有任何内容可以创建文件。您打印一些输出,但不对openwrite 文件执行任何操作。

也许您应该阅读IOFile 文档并查看您是如何使用filepath 变量的?

第二个问题是你不会在任何地方调用你的方法。虽然它已经定义并且 Ruby 会看到它并解析方法,但它不知道你想用它做什么,除非你调用这个方法:

def mechanize_club
  ...
end

mechanize_club()

【讨论】:

  • 好的,所以这些行不在指定路径创建 xml 文档? filepath = '/davidgeismar/Documents/codeclubs.xml' builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml| xml.root { xml.codeclubs { @codeclubss.each do |c| xml.codeclub { xml.code_ c.code } end } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 2019-04-02
相关资源
最近更新 更多