【发布时间】:2021-03-13 23:58:04
【问题描述】:
我正在通过下面的代码使用 python 训练网页抓取。
但是其中一个数据有两个 xpath,我想知道是否有一种方法可以使用“if”条件捕获两者,但我不知道如何将其插入到我的代码中。谁能指导我?
例如,如果其中一个 xpath 为 null,那么它肯定是另一个。不知道解释得好不好,但是如果我有a和b,如果a为null则b。
'vlr_atual'可以分别为:
product.xpath(".//span[@id='priceblock_ourprice']/text()").get()
product.xpath(".//span[@id='priceblock_saleprice']/text()").get()
import scrapy
import datetime
class ProductsSpider(scrapy.Spider):
name = 'products'
allowed_domains = ['www.amazon.com.br']
start_urls = ['https://www.amazon.com.br/s?i=computers&bbn=16339926011&rh=n%3A16364756011&fs=true&qid=1615634908&ref=sr_pg_1']
def parse(self, response):
for produto in response.xpath("//div[@class='a-section a-spacing-medium']"):
selo = produto.xpath(".//span[@class='a-badge-text']/text()").get()
link = response.urljoin(produto.xpath(".//h2/a/@href").get())
yield response.follow(url=link, callback=self.parse_details, meta={'selo' : selo})
next_page = response.urljoin(response.xpath("//li[@class='a-last']/a/@href").get())
if next_page:
yield scrapy.Request(url=next_page, callback=self.parse)
def parse_details(self, response):
selo = response.request.meta['selo']
for produto in response.xpath("//div[@id='dp']"):
vlr_atual = produto.xpath(".//span[@id='priceblock_ourprice']/text()").get()
if vlr_atual is None:
vlr_atual = produto.xpath(".//span[@id='priceblock_saleprice']/text()").get()
yield{
'data' : datetime.datetime.now().strftime("%Y%m%d"),
'selo': selo,
'nome': produto.xpath("normalize-space(.//span[@id='productTitle']/text())").get(),
'vlr_atual': vlr_atual,
'estoque': produto.xpath("normalize-space(.//select[@name='quantity']/option[last()]/text())").get(),
'ean': produto.xpath("normalize-space(.//table[@id='productDetails_techSpec_section_1']//tr[last()]/td/text())").get(),
}
【问题讨论】:
-
你卡在哪里了?您需要 (1) 获取一条路径; (2) 检查是否为空; (3) 如果没有,使用该路径; (4) 如果是,则使用其他。这些都是微不足道的一步,不是吗?
-
@Prune 我被卡住了,因为有些产品使用第一个 xpath,有些使用我在问题中提出的第二个 xpath。今天我放了第一个xpath,很多产品都出来了。当我去查看它时,我意识到这是使用第二个 xpath 的产品。所以我想要一种设置条件的方法,如果第一个为空,我得到第二个。
-
那么如何判断第一个路径是否为空呢?
-
@Prune 我放了完整的代码,也许会更清楚。每页有几种产品,我访问每个产品的链接,但有时 xpath 的价格会有所不同。我是通过运行代码发现的。
标签: python web-scraping xpath scrapy