Я не могу продублировать исключение с Hpricot.Тем не менее, я вижу проблемы с тем, как вы пытаетесь найти метатег.
Я сократил образец HTML, чтобы мой пример кода поместился здесь, в поле ответа, затем сохранил HTML локально, чтобы я мог использовать open-uri, чтобы добраться до него.
<html>
<head>
<noscript>
<meta http-equiv="refresh" />
</noscript>
<meta name="norton-safeweb-site-verification" />
</head>
<body>
<h1>Testing</h1>
</body>
</html>
Размышляйте о результатах поиска ниже:
#!/usr/bin/env ruby
require 'rubygems'
require 'hpricot'
require 'open-uri'
doc = Hpricot(open('http://localhost:3000/test.html'))
(doc / 'meta').size # => 2
(doc / 'meta')[1] # => {emptyelem <meta name="norton-safeweb-site-verification">}
(doc % 'meta[@name]') # => {emptyelem <meta name="norton-safeweb-site-verification">}
(doc % 'meta[@name="verification"]') # => nil
(doc % 'meta[@name*="verification"]') # => {emptyelem <meta name="norton-safeweb-site-verification">}
(doc % 'meta[@name="norton-safeweb-site-verification"]') # => {emptyelem <meta name="norton-safeweb-site-verification">}
Помните, что '/' в Hpricot означает .search () или "найти все вхождения"и"% "означает .at () или" найти первое вхождение ".Использование длинного пути, чтобы добраться до нужного элемента, часто менее вероятно, чтобы найти то, что вы хотите.Ищите уникальные вещи в элементе или его родных братьях или родителях.Длинный аксессор ломается легче, потому что предыдущий макет страницы учитывается при поиске;Если что-то на странице изменится, средство доступа будет недействительным, поэтому ищите атомарно или в наименьшей группе элементов, которую вы можете.Кроме того, документы Hpricot рекомендуют использовать средства доступа CSS, поэтому я использую их в примере кода.
При поиске любого метатега было обнаружено два вхождения.Все идет нормально.Взятие второго было одним из способов получить то, что вы хотите.
Поиск «мета с параметром имени» нашел цель.
Поиск «мета с параметром имени, состоящим из 'проверка не проходит, потому что ее нет.Поиск внутри параметра с использованием «* =» работает.
Поиск «мета с параметром имени, состоящим из« norton-safeweb-site-validation »» успешен, поскольку это полное значение параметра.
Hpricot имеет довольно хороший набор CSS-селекторов:
http://wiki.github.com/whymirror/hpricot/supported-css-selectors
Теперь, все, что сказано, I рекомендует использовать Nokogiri вместо Hpricot.Я обнаружил случаи, когда Hpricot молчаливо терпел неудачу, но Nokogiri успешно анализировал искаженные XML и HTML.