Я пытаюсь собрать информацию о населении со страниц стран Википедии. Проблема, с которой я сталкиваюсь, состоит в том, что в узле, который я пытаюсь очистить, нет информации, относящейся к заполнению, вместо этого на заполнение ссылаются только в узле перед ним. Поэтому, используя Xpath, я пытаюсь заставить выражение перейти к следующему узлу, но не могу найти правильную команду.
Например, для следующей страницы:
https://en.wikipedia.org/wiki/Afghanistan
Ниже приведено выражение xpath, которое приводит меня к узлу перед номером I популяции хочу очистить:
//table[@class='infobox geography vcard']//tr[@class = 'mergedtoprow']//a[contains(@href,"Demographics")]/../..
Он ищет ссылку в таблице, которая содержит «Демография», затем поднимается на два уровня к родителям родителей. Но проблема в том, что заголовок находится в другом узле, чем число, которое я хочу извлечь, и поэтому мне нужно что-то, что может go перейти к следующему узлу.
Я видел выражение / follow-sibling :: div [1], но, похоже, это не работает для моего выражения, и я не знаю почему.
Если кто-то может придумать более прямой способ поиска узла на приведенной выше веб-странице, который был бы тоже хорошо.
Спасибо
Редактировать: Ниже приведен Python код, который я использую
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from urllib.parse import urljoin
class CountryinfoSpider(scrapy.Spider):
name = 'CountryInfo'
allowed_domains = ['en.wikipedia.org']
start_urls = ['https://en.wikipedia.org/wiki/List_of_sovereign_states_in_the_2020s']
def parse(self, response):
## Extract all countries names
countries = response.xpath('//table//b//@title').extract()
for country in countries:
url = response.xpath('//table//a[@title="'+ country +'"]/@href').extract_first()
capital = response.xpath('//table//a[@title="'+ country +'"]/../..//i/a/@title').extract()
absolute_url = urljoin('https://en.wikipedia.org/', url)
yield Request(absolute_url, callback = self.parse_country)
def parse_country(self, response):
test = response.xpath('//table[@class='infobox geography vcard']//tr[@class = 'mergedtoprow']//a[contains(@href,"Demographics")]/../..').extract()
yield{'Test':test}
Это немного сложнее, чем я объяснил, но я go на сайт "Список суверенных государств в 2020-х годах". Скопируйте названия стран, столиц и URL. Затем я go в URL, после присоединения его к Википедии и пытаюсь использовать выражение xpath, над которым я работаю, чтобы привлечь население.
Спасибо