механизировать проблему очистки HTML - PullRequest
3 голосов
/ 24 мая 2009

, поэтому я пытаюсь извлечь письмо с моего сайта, используя ruby ​​mechanize и hpricot. что я пытаюсь сделать его цикл на всех страницах моей административной стороны и разобрать страницы с hpricot.so пока все хорошо. Тогда я получаю:

Exception `Net::HTTPBadResponse' at /usr/lib/ruby/1.8/net/http.rb:2022 - wrong status line: *SOME HTML CODE HERE*

когда он анализирует пачку страниц, он начинается с тайм-аута, а затем печатает HTML-код страницы. не могу понять почему? как я могу отладить это? кажется, что Mechanize может получить более 10 страниц подряд ?? Является ли это возможным?? спасибо

</p>

<p>require 'logger'
require 'rubygems'
require 'mechanize'
require 'hpricot'
require 'open-uri'</p>

<p>class Harvester</p>

<p>def initialize(page)
    @page=page
    @agent = WWW::Mechanize.new{|a| a.log = Logger.new("logs.log") }
    @agent.keep_alive=false
    @agent.read_timeout=15</p>

<p>end</p>

<p>def login
    f = @agent.get( "http://****.com/admin/index.asp") .forms.first
    f.set_fields(:username => "user", :password =>"pass")
        f.submit<br>
  end</p>

<p>def harvest(s)
    pageNumber=1
    #@agent.read_timeout = 
    s.upto(@page) do |pagenb|</p>

<pre><code>    puts "*************************** page= #{pagenb}/#{@page}***************************************"      
    begin
        #time=Time.now
        #search=@agent.get( "http://****.com/admin/members.asp?action=search&term=&state_id=&r=500&p=#{page}")          
        extract(pagenb)

    rescue => e
        puts  "unknown #{e.to_s}"
        #puts  "url:http://****.com/admin/members.asp?action=search&term=&state_id=&r=500&p=#{page}"
        #sleep(2)
        extract(pagenb)

    rescue Net::HTTPBadResponse => e
        puts "net exception"+ e.to_s
    rescue WWW::Mechanize::ResponseCodeError => ex
        puts "mechanize error: "+ex.response_code   
    rescue Timeout::Error => e
        puts "timeout: "+e.to_s
    end


end

конец

def extract (страница) #puts search.body search=@agent.get ("http://***.com/admin/members.asp?action=search&term=&state_id=&r=500&p=#{page}") doc = Hpricot (search.body)

        #remove titles
        #~ doc.search("/html/body/div/table[2]/tr/td[2]/table[3]/tr[1]").remove 

        (doc/"/html/body/div/table[2]/tr/td[2]/table[3]//tr").each do |tr|              
            #delete the phone number from the html
            temp = tr.search("/td[2]").inner_html
            index = temp.index('<')
            email = temp[0..index-1]
            puts  email
            f=File.open("./emails", 'a')
            f.puts(email)
            f.close     
        end 

конец

конец

ставит "начало извлечения писем ..."

start = ARGV [0] .to_i

ч = Harvester.new (186) h.login h.harvest (старт)

1 Ответ

3 голосов
/ 27 августа 2009

Mechanize помещает все содержимое страницы в историю, это может вызвать проблемы при просмотре многих страниц. Чтобы ограничить размер истории, попробуйте

@mech = WWW::Mechanize.new do |agent|
  agent.history.max_size = 1
end
...