Как использовать XPath в Nokogiri? - PullRequest
25 голосов
/ 17 января 2010

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


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

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

Ответы [ 2 ]

45 голосов
/ 17 января 2010

Похоже, вам нужно прочитать Учебник XPath

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

  • // - в любом месте вашего XML-документа
  • table/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> элемент.

7 голосов
/ 17 января 2010

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

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

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


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

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

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

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

Где theNode - ваш Nokogiri Узел объект.


Edit:

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

doc.xpath("td[3]/div[1]/a").each do |anchor|
    puts anchor['href']
    puts anchor['src']
    ...
end
...