2017-01-31 14 views
2

Так что, ребята, я делаю веб-парсер, это было хорошо, но я видел, что некоторые слова внутри <head> завинчивают все (и <strong> в теле тоже). Мой код This one here before nokogiri, но я новичок в программировании на Ruby и только начал узнавать о Nokogiri несколько часов назад.Извлечение <head> вопросов, мне нужно руководство/помощь

Желаю, чтобы кто-то помог мне выполнить эту работу. Мне нужно. Прочесть URL-адрес, удалить <head> и все внутри него и отсканировать слова по остальной странице

PS: Возможно ли принести JUST тело и прочитать его? Было бы проще PSS: около <strong> тегов, трудно ли его удалить?

Мои упражнения посчитайте, сколько especific слова находятся на странице, а не исходный код, то почему я должен только захватить тело и устранить тег

действительно надеюсь, что кто-то может помочь мне>. < Thnks guys!

Вот мой фактический код ошибки/Чистый оригинал here

require 'open-uri' 
require 'cgi' 
require 'nokogiri' 



class Counter 

    def initialize(url) 
     @url = url 
    end 

    def decapitate 

     Nokogiri::HTML(url) 

     url.css('head').remove.to_s 
    end 

    def scan(word) 
     url.scan(word) 
    end 



end 

url, word = ARGV 

puts "Found #{Counter.new(url).open.decapitate.scan(word).length} maches." 

ответ

3

Много ошибок там.

  • url в decapitate является неопределенной локальной переменной. Вам нужно использовать @url.

  • Nokogiri::HTML ожидает либо объект IO, либо строку, а не URL-адрес. Вы, вероятно, хотели использовать open(@url) для чтения содержимого URL (я предполагаю, что, учитывая, что вам требуется open-uri

  • Nokogiri::HTML возвращает документ, но не хранить возвращаемое значение в любом месте

  • Следовательно, url (или а @url) будет строка, а строки не имеют метод css, вы хотите применить css к документу вместо

  • remove возвращает узел, который удаляется, как последний вещь в методе, это будет то, что возвращается. Таким образом, decapitate вернет текст узла head.

  • В конце ...decapitate.scan вызывается метод String#scan, а не метод, который вы определили.

Вы можете делать то, что вы хотите, следующим образом:

def count(pattern, url) 
    doc = Nokogiri::HTML(open(url)) 
    doc.css('head').remove 
    doc.text.scan(pattern).size 
end 
+0

Использование '@ url', вероятно, лучше, чем передача в' url' дважды двумя различными способами. – tadman

+0

@ tadman: О да, я, вероятно, не был ясен. Мое решение внизу - вместо OP, а не плагина. Его достаточно легко адаптировать. Если бы он шел в класс, я бы схватил, обезглавил и текстурировал в конструкторе, сохраняя '@ text', а не' @ url', чтобы можно было считать несколько вещей в одном документе ... – Amadan

+0

А, это имеет смысл, автономный метод. – tadman