Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 使用XPath选择Python中的下一个节点_Html_Python 3.x_Parsing_Xpath_Scrapy - Fatal编程技术网

Html 使用XPath选择Python中的下一个节点

Html 使用XPath选择Python中的下一个节点,html,python-3.x,parsing,xpath,scrapy,Html,Python 3.x,Parsing,Xpath,Scrapy,我试图从维基百科的国家网页上搜集人口信息。我遇到的问题是,在我试图刮取的节点中,没有引用填充的信息,而填充仅在它之前的节点中引用。因此,我尝试使用Xpath将表达式移动到下一个节点,但找不到正确的命令 例如,对于以下页面: 下面是一个xpath表达式,它将我带到我要刮取的填充数之前的节点: //table[@class='infobox geography vcard']//tr[@class = 'mergedtoprow']//a[contains(@href,"Demographics"

我试图从维基百科的国家网页上搜集人口信息。我遇到的问题是,在我试图刮取的节点中,没有引用填充的信息,而填充仅在它之前的节点中引用。因此,我尝试使用Xpath将表达式移动到下一个节点,但找不到正确的命令

例如,对于以下页面:

下面是一个xpath表达式,它将我带到我要刮取的填充数之前的节点:

//table[@class='infobox geography vcard']//tr[@class = 'mergedtoprow']//a[contains(@href,"Demographics")]/../..
它在包含“人口统计信息”的表中搜索href,然后向上两级搜索父项的父项。但问题是标题与我要提取的编号在不同的节点中,因此我需要一些可以转到下一个节点的内容

我见过表达式/following 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}
这比我解释的要复杂一点,但我会去网站“2020年代主权国家名单”。复制国家名称、大写字母和URL。然后我进入url,在将其加入Wikipedia之后,尝试使用我正在研究的xpath表达式来吸引人群


谢谢

我想对你的问题的一般回答是:“谓词可以嵌套”

//表[
@class='infobox地理vcard'
]//tr[
@class='mergedtoprow'和//a[包含(@href,“人口统计”)]
]/以下同级::tr[1]/td/text()[1]

您能否包含用于获取页面源代码和应用XPath表达式的最小Python代码?还包括给定特定Wiki页面的预期输出。谢谢。Wikipedia有一个API,甚至还有一个Python库包装了这个API。想想你是否一定要使用网络抓取来获取数据。感谢Tomatak,寻找API是一个很好的建议。但我应该在我的问题中提到,这只是我在维基百科上选择的一个任意主题,用来学习和练习使用xpath抓取HTML。谢谢Tomalak!我了解到谓词可以嵌套,但当我上次看到following sibling::时,它没有连接到sibling::div[1],而div就是节点,因此在本例中,它没有像应该在sibling::tr[1]之后那样工作。@Christopher嵌套谓词将您从硬编码的“两级向上”
。/../
,这使得XPath表达式具有更强的弹性。但它也更自然,因为它类似于“包含该链接的行之后的行”。