Как я использую XPath в Nokogiri?

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


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

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


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

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

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

25
задан Community 23 May 2017 в 10:31
поделиться

2 ответа

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

Ваше //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, если есть только один элемент .

45
ответ дан 28 November 2019 в 20:45
поделиться

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

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

"код выше приведет меня к любой table table's tr, where, имеющей дочерний элемент tbody с атрибутом id равным threadbits_forum_251"


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

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

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

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

Где узел - ваш объект Нокогири Node.


Edit:

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

doc.xpath("td[3]/div[1]/a").each do |anchor|
    puts anchor['href']
    puts anchor['src']
    ...
end
7
ответ дан 28 November 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: