Как использовать XPath в Nokogiri?

Я не нашел ни документации, ни учебника по этому поводу. Что-нибудь подобное существует?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

Приведенный выше код даст мне любой table в любом месте, у которого есть tbody дочерний элемент с атрибутом id, равным threadbits_forum_251. Но почему он начинается с двойного //? Почему в конце стоит /tr? Дополнительные сведения см. В разделе «Ruby Nokogiri Parsing HTML table II».


Кто-нибудь может сказать мне, как извлечь href, id, alt, src и т. Д. С помощью Nokogiri?

td[3]/div[1]/a/text()' <--- extracts text

Как я могу извлечь другие вещи?


person Radek    schedule 17.01.2010    source источник


Ответы (2)


Кажется, вам нужно прочитать Руководство по XPath

Ваше //table/tbody[@id="threadbits_forum_251"]/tr выражение означает:

  • // - в любом месте вашего XML-документа
  • table/tbody - взять элемент таблицы с дочерним элементом tbody
  • [@id="threadbits_forum_251"] - где атрибут id равен "threadbits_forum_251"
  • tr - и берем его tr элементов

Итак, по сути, вам нужно знать:

  • атрибуты начинаются с @
  • условия заключаются в [] скобки

Если я правильно понял этот API, вы можете использовать doc.xpath("td[3]/div[1]/a")["href"] или td[3]/div[1]/a/@href, если есть только один <a> элемент.

person Rubens Farias    schedule 17.01.2010
comment
@Rubens, спасибо. И вы правы, мне нужно прочитать руководство по XPath. Я думал, что это документ nokorigi, который мне нужно прочитать ... знаете ли вы, есть ли какой-либо инструмент, который предоставит мне полный Xpath, если я щелкну и возьму объект на html-странице? - person Radek; 17.01.2010
comment
Не знаю, но XPath не так уж и сложен; рассмотрим вашу файловую систему и предположим, что каждая папка является элементом XML; Итак, когда вы выберете свою system32 папку, вы получите \windows\system32 путь; просто замените этот \` на /, рассмотрите атрибуты, начинающиеся с @, и условия на [], и все готово - person Rubens Farias; 17.01.2010
comment
Я знаю, что это более старый ответ, но ссылка на руководство по xpath теперь не работает. Думаю, теперь он должен быть w3schools.com/xsl/xpath_intro.asp - person Axiombadger; 17.02.2016
comment
Исправлено, @Axiombadger! - person Rubens Farias; 17.02.2016

Ваш XPath правильный, и вы, кажется, ответили на первую часть своего вопроса (почти):

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')

"приведенный выше код даст мне tr любой таблицы table, где угодно, у которой есть дочерний элемент tbody с идентификатором атрибута, равным threadbits_forum_251"


// означает, что следующий элемент может появиться в любом месте документа.

/tr в конце означает получение узла tr соответствующего элемента.

Вам не нужно извлекать каждый атрибут один за другим. Просто получите весь узел, содержащий все четыре атрибута в Nokogiri, и получите атрибуты, используя:

theNode['href']
theNode['src']

Где theNode - ваш объект Node в Nokogiri.


Редактировать:

Извините, я не использовал эти библиотеки, но думаю, что оценка и анализ XPath выполняется Mechanize. Итак, вот как вы получите весь элемент и его атрибуты за один раз.

doc.xpath("td[3]/div[1]/a").each do |anchor|
    puts anchor['href']
    puts anchor['src']
    ...
end
person Anurag    schedule 17.01.2010
comment
@Anurag, спасибо за хорошее объяснение. Я использую механизировать, а не чистый nokogiri, могу ли я как-то использовать узел ['href'] в [: title, 'td [3] / div [1] / a / text ()'], ? Я хочу извлечь href вместо текста - person Radek; 17.01.2010
comment
я искал уроки nokogiri и наткнулся на свой ответ .. хе-хе :) - person Anurag; 21.04.2011
comment
Mechanize использует Nokogiri внутри, поэтому он использует чистый Nokogiri, это просто за кулисами. Mechanize::Page.parser от Mechanize возвращает корень проанализированной страницы как Nokogiri документ. - person the Tin Man; 20.08.2013