Html 使用XPath选择Python中的下一个节点
我试图从维基百科的国家网页上搜集人口信息。我遇到的问题是,在我试图刮取的节点中,没有引用填充的信息,而填充仅在它之前的节点中引用。因此,我尝试使用Xpath将表达式移动到下一个节点,但找不到正确的命令 例如,对于以下页面: 下面是一个xpath表达式,它将我带到我要刮取的填充数之前的节点: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"
//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表达式具有更强的弹性。但它也更自然,因为它类似于“包含该链接的行之后的行”。