Выберите следующий узел в Python с XPath - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь собрать информацию о населении со страниц стран Википедии. Проблема, с которой я сталкиваюсь, состоит в том, что в узле, который я пытаюсь очистить, нет информации, относящейся к заполнению, вместо этого на заполнение ссылаются только в узле перед ним. Поэтому, используя 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, над которым я работаю, чтобы привлечь население.

Спасибо

1 Ответ

1 голос
/ 06 марта 2020

Я думаю, что общий ответ на ваш вопрос: «предикаты могут быть вложенными».

//table[
  @class='infobox geography vcard'
]//tr[
  @class = 'mergedtoprow' and .//a[contains(@href, "Demographics")]
]/following-sibling::tr[1]/td/text()[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...