python-3.x - Python3 抓取一页的所有信息
问题描述
我的蜘蛛:
import scrapy
class LinkSpider(scrapy.Spider):
name = "page"
start_urls = [
'https://www.topart-online.com/de/Blattzweige-Blatt-und-Bluetenzweige/l-KAT282?seg=1'
]
def parse(self, response):
yield{
'ItemSKU': response.xpath('//span[@class="sn_p01_pno"]/text()').getall(),
'title': response.xpath('//div[@class="sn_p01_desc h4 col-12 pl-0 pl-sm-3 pull-left"]/text()').getall(),
'ItemEAN': response.xpath('//div[@class="productean"]/text()').getall(),
'Delivery_Status': response.xpath('//div[@class="availabilitydeliverytime"]/text()').getall()
}
如何将我的值分开,我得到一个带有第 1 行的 csv 文件:itemsku,title,itemean,deliverystatus 和正确的值?现在我的 csv 全部存储在一行中,所以都是 skus,所有标题等等。 我的csv文件
解决方案
getall()
抓取您尝试使用 XPATH 选择器获取的所有值的列表。因此,它将键“ITEMSKU”的值例如放在列表中[item1,item2,item3,item4]
为了获得标题等,您需要使用该get()
方法。但在此之前,您需要更详细地检查 HTML。您尝试从中获取数据的页面在单独的“卡片”中包含信息。获取您想要的单个数据ITEMSKU
等的最合乎逻辑的方法是循环每个“卡片”,然后生成ITEMSKU
with的字典get()
。
您还需要检查您的 XPATH 选择器,因为 productean 不在该页面上。它在每个项目自己的链接中,但不在您正在抓取的页面上。
代码示例
import scrapy
class LinkSpider(scrapy.Spider):
name = "link"
allow_domains = ['topart-online.com']
start_urls = ['https://www.topart-online.com/de/Blattzweige-Blatt-und-Bluetenzweige/l-KAT282?seg=1']
def parse(self, response):
card = response.xpath('//a[@class="clearfix productlink"]')
for a in card:
yield{
'title': a.xpath('.//div[@class="sn_p01_desc h4 col-12 pl-0 pl-sm-3 pull-left"]/text()').get().strip(),
'links': a.xpath('@href').get(),
'ItemSKU': a.xpath('.//span[@class="sn_p01_pno"]/text()').get().strip(),
'ItemEAN': a.xpath('.//div[@class="productean"]/text()').get(),
'Delivery_Status': a.xpath('.//div[@class="availabilitydeliverytime"]/text()').get().strip().replace('/','')
}
解释
页面上的每个项目都在一张卡片内。变量 XPATH 选择器为我们提供了这些卡片的card
列表。我们可以循环的列表。
然后我们围绕这些卡中的每一个进行循环。请注意,我们使用a.xpath
而不是response.xpath
. 那是因为我们要从每张卡片中选择数据。
另请注意,在每个 XPATH 选择器的开头,我们使用.//
而不是//
.
.//
告诉 scrapy 我们要查看每个卡片变量的子元素,而不是整个 HTML 文档。请记住//
搜索整个 HTML 文档。这称为相对 XPATH,当您有一个“卡片”列表要从每个单独的卡片中获取数据时,与每个 XPATH 选择器一起放置是很重要的。
请注意,我们使用strip()
字符串方法去除运行此代码时获得的任何开始和结束空白。
另请注意,对于交付状态,数据中有一个“/”,因此使用替换字符串方法将其替换为“”可以摆脱它。
推荐阅读
- python - Tkinter 菜单栏垂直点分隔符
- ionic-framework - 是否从 NPM 中删除了 Ionic 4 Beta?
- java - 奇怪的“找不到符号”Java,带有 TreeSet 集合
- corda - CorDapp jars 可以在 Corda Enterprise 中热部署吗?
- java - 比较带状疱疹的近重复检测
- c++ - 如果尝试清理,由于崩溃而不可避免的 libxml2 内存泄漏
- spring-boot - Spring Boot Show Error with tomcat 8 connection pool打开的文件太多
- arrays - 找不到不同的支持对象'[object Object]
- python - 将字符串转换为熊猫数据框
- python - TypeError:字符串索引必须是使用 pandas 的整数适用于 lambda