2013-01-07 21 views
4

Загрузив HTML-страницу (X), я пытаюсь получить значение атрибута «content» метатега. Например, данный:Пытаться извлечь значения атрибутов с помощью Nokogiri с помощью пользовательских псевдощелевых CSS-селекторов

<meta name="author" content="John Smith" /> 

Я хотел бы извлечь значение «Джон Смит».

Я знаю, как сделать это с помощью XPath и понять, что CSS был предназначен в первую очередь для выбора элементов, но Nokogiri поддерживает определение custom CSS pseudoclasses, который я думал, что может быть использовано следующим образом:

class CSSext 
    def attr(nodeset, tag) 
    nodeset.first.attribute_nodes.find_all {|node| node.name == tag} 
    end 
end 

doc = Nokogiri::HTML(open(someurl)) 
doc.css("meta[name='name']:attr('content')", CSSext.new) 

Однако это возвращает тот же результат как

doc.css("meta[name='name']") 

Что дает? Nokogiri использует тот же движок внизу для поиска CSS и XPath, поэтому все, что возможно в XPath, должно выполняться в CSS. Как мне следует извлечь значение атрибута?

+0

Почему вы не берете простой путь и не используете 'doc.css (" meta [name = 'name'] ")'? CSS в Nokogiri - очень удобная замена XPath в любом поиске узла. Сделайте более простую вещь, которая упрощает и понимает и поддерживает. –

+0

@Scott Roepnack: Это не [подходящее использование обратных шагов] (http://stackoverflow.com/editing-help#code-spans) для форматирования. Обратите внимание, что вы также вызвали ссылку Markdown ... – BoltClock

+0

@BoltClock thanks –

ответ

5

Почему бы не просто?

doc.at("meta[name='author']")['content'] 

Насколько я понимаю, pseudoclasses может быть использован для фильтрации только набор узлов, но не заменить набор узлов с каким-либо другим значением, например, как значение одного атрибута из узлов-х годов.

+0

Это даст нам ошибку. Вы хотите 'at_css' или просто' at' – pguardiario

+0

Исправить, спасибо @pguardiario – akuhn

Смежные вопросы