Как использовать 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
Как я могу извлечь другие вещи?
Ответы
Ответ 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