Получение доступа к спорадически доступным разделам Википедии - PullRequest
0 голосов
/ 17 мая 2018

Мне нужно получить некоторые данные, но я совершенно ошарашен, попробовав несколько вещей.

Я хочу получить доступ к авиакомпаниям и пунктам назначения на вики-странице Albuquerque_International_Sunport - учтите, я буду просматривать предварительно заполненный список аэропортов с этими данными.

Существует несколько «типов» авиакомпаний: пассажирские, грузовые, иногда есть другие (под?) Разделы;в других случаях их нет:

enter image description here

Статьи для нескольких аэропортов будут доступны автоматически, включая некоторые менее известные аэропорты.Это означает, что мне нужно:

  1. Проверить, существует ли раздел «Авиакомпании и пункты назначения»
  2. Взять все данные внутри любой таблицы
  3. Очистить ее;в противном случае ничего не делать

Я пытался использовать ruby ​​ wikipedia-client gem , однако метод .raw_data даже не возвращает данные раздела:

enter image description here

Затем я перешел к API Википедии: если я не ошибаюсь, но он не возвращает имена разделов!Это кажется неправильным, но я не смог заставить его работать.

Так что я полагаю, это оставляет Нокогири.Я могу нормально захватывать и анализировать страницы, но:

Как бы я мог обнаружить наличие раздела «Авиакомпании и пункты назначения», получив все данные таблицы ДО конца раздела?У меня есть подозрение, что для этого мне нужен какой-то хитрый Xpath.

Кажется, что это единственное жизнеспособное решение.

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

Редактировать: Возможно, лучше просто каким-то образом собрать список всех авиакомпаний в мире и ударить их по HTML?Похоже, это может быть вычислительно дорого.

1 Ответ

0 голосов
/ 17 мая 2018

Ну, я не опытный пользователь Nokogiri, но, возможно, это может дать вам некоторое представление.

require 'nokogiri'
require 'open-uri'

page = Nokogiri::HTML(open("https://en.wikipedia.org/wiki/Albuquerque_International_Sunport"))

# this is the passenger table
page.xpath('//*[@id="mw-content-text"]/div/table[2]/tr').each do |tr|
  p tr.text()
  puts "-"*50
end

# this is the cargo table
page.xpath('//*[@id="mw-content-text"]/div/table[3]/tr').each do |tr|
  p tr.text()
  puts "-"*50
end
...