Проблема в том, что вы пытаетесь использовать метод 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 делать это.