Как удалить HTTP-ссылки с ActiveSupport "sets_with", используя Nokogiri? - PullRequest
0 голосов
/ 07 мая 2011

Когда я пытаюсь это:

item.css("a").each do |a|
  if !a.starts_with? 'http://'
     a.replace a.content
  end
end

Я получаю:

NoMethodError: undefined method 'starts_with?' for #<Nokogiri::XML::Element:0x1b48a60> 

EDIT:

Конечно, есть более чистый способ, но, похоже, он работает.

item.css("a").each do |a|
  unless a["href"].blank?
    if !a["href"].starts_with? 'http://' 
      a.replace a.content
    end
  end
end

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Проблема в том, что вы пытаетесь использовать метод starts_with для объекта, который его не реализует.

item.css("a").each do |a|

вернет узлы XML в a.Они принадлежат Нокогири.То, что вы хотите сделать, это преобразовать узел в текст, но только ту часть, которую вы хотите проверить, к которой, поскольку это параметр узла, можно получить доступ следующим образом:

a['href']

Итак, вы хотитечтобы использовать что-то вроде этого:

item.css("a").each do |a|
  if !(a.starts_with?['href']('http://'))
     a.replace(a.content)
  end
end

Недостатком этого является то, что вы должны проходить через каждый тег <a> в документе, который может быть медленным на большой странице с большим количеством ссылок.

Альтернативный способ - использовать функцию starts-with XPath:

require 'nokogiri'

item = Nokogiri::HTML('<a href="doesnt_start_with">foo</a><a href="http://bar">bar</a>')
puts item.to_html

, которая выдает:

>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
>> <html><body>
>> <a href="doesnt_start_with">foo</a><a href="http://bar">bar</a>
>> </body></html>

Вот как это сделать с помощью XPath:

item.search('//a[not(starts-with(@href, "http://"))]').each do |a|
  a.replace(a.content)
end
puts item.to_html

Что выводит:

>> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
>> <html><body>foo<a href="http://bar">bar</a>
>> </body></html>

Преимущество использования XPath для поиска узлов заключается в том, что все это выполняется в скомпилированном C, а не позволяет Ruby делать это.

0 голосов
/ 07 мая 2011

Не должен ли этот метод быть start_with?

...