как использовать nokogiri методы .xpath и .at_xpath

Я изучаю, как использовать nokogiri, и немного вопросов прибыли ко мне на основе кода ниже

require 'rubygems'
require 'mechanize'

post_agent = WWW::Mechanize.new
post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')

puts "\nabsolute path with tbody gives nil"
puts  post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]').xpath('text()').to_s.strip.inspect

puts "\n.at_xpath gives an empty string"
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").at_xpath('text()').to_s.strip.inspect

puts "\ntwo lines solution with .at_xpath gives an empty string"
rows =   post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")
puts rows[0].at_xpath('text()').to_s.strip.inspect


puts
puts "two lines working code"
rows =   post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")
puts rows[0].xpath('text()').to_s.strip

puts "\none line working code"
puts post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip

puts "\nanother one line code"
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").xpath('text()').to_s.strip

puts "\none line code with full path"
puts post_page.parser.xpath("/html/body/div/div/div/div/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip
  • лучше использовать//или / в xpath? @AnthonyWJones говорит, что 'использование неснабженного префиксом//' не является настолько хорошей идеей
  • Я должен был удалить tbody из любой работы xpath иначе, я получил 'нулевой' результат. Как возможно удалить элемент из xpath для получения вещей работа?
  • я должен использовать .xpath дважды для извлечения данных, не используя полный xpath?
  • почему я не могу сделать .at_xpath, работающий для извлечения данных? это работает приятно здесь, каково различие?

5
задан Community 23 May 2017 в 12:00
поделиться

1 ответ

Проблема живет в / (? P \ d {2}) / Часть вашей URL-конфигурации. Это позволяет только именно две цифры ( \ d {2} ) в то время как emain.pub_date.month - только одна цифра.

Вы можете сделать, либо разрешать также одну цифру в URL-адресе (но это нарушит принцип уникальных URL, / 2010/1 / ... будет таким же, как / 2010 / 01 / ... ) Или пройдите две цифры в аргумент месяца в вашем URL Templatetag.
Вы можете использовать дату фильтр для достижения согласованного формирования объектов даты. Используйте тег URL, подобный этому:

{% url paper_issue_section_detail issue.pub_date|date:"Y",issue.pub_date|date:"m",issue.pub_date|date:"d",section_li.slug %}

Посмотрите на сайт месяца и дневного аргумента: он всегда будет отображаться в виде двух цифр (при необходимости). Посмотрите на документацию TEAT TAG , чтобы увидеть, какие варианты возможны для даты фильтра.

-121--2557716-
  1. // означает каждый узел на каждом уровне, поэтому он намного дороже по сравнению с /
  2. Вы можете использовать * как заполнитель.
  3. Нет, вы можете сделать запрос XPath, получить элемент, затем вызовите текст Nokogiri метода на узле
  4. , конечно, вы можете. Посмотрите на этот вопрос и мой файл эталона. Вы увидите пример at_xpath .

Я нашел, что вы часто используете текст () выражение. Это не требуется с использованием Nokogiri. Вы можете получить узел, затем вызовите текст метода на узле. Это намного дешевле.

Также имейте в виду, Nokogiri поддерживает селекторов .css. Их может быть проще, если вы работаете с HTML-страницами.

8
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

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