Подтвердить что ты не робот

Как использовать XPath в Нокигири?

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


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

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


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

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

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

4b9b3361

Ответ 1

Кажется, вам нужно прочитать Учебник по 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>.

Ответ 2

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

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

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


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

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

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

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

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


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

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

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