【发布时间】:2020-12-01 08:57:00
【问题描述】:
我想从网站上抓取一些元素,我必须保持值的顺序。 比如:
def parse(self, response):
id_num = response.css('td:nth-child(1)::text').getall()
issued_at = response.css(
'.align-center.xcrud-current::text').getall()
exchange = response.css(
'.xcrud-current+ .align-center::text').getall()
base_currency = response.css(
'.align-center:nth-child(4)::text').getall()
coin = response.css(
'.align-center:nth-child(5)::text').getall()
direction = response.css(
'.align-center:nth-child(6)::text').getall()
ask = response.css(
'.align-right:nth-child(7)::text').getall()
target = response.css(
'.align-right:nth-child(8)::text').getall()
highest = response.css(
'.align-right:nth-child(9)::text').getall()
lowest = response.css(
'.align-right:nth-child(10)::text').getall()
status = response.css(
'td:nth-child(11)::text').getall()
close_time = response.css(
'.align-right~ .align-center::text').getall()
dca_level = response.css(
'.align-right:nth-child(13)::text').getall()
for id_num, issued_at, exchange, base_currency, coin, direction, ask, target, highest, lowest, status, close_time, dca_level in\
zip(id_num, issued_at, exchange, base_currency, coin, direction, ask, target, highest, lowest, status, close_time, dca_level):
yield{
'Id': id_num,
'Issued At': issued_at,
'Exchange': exchange,
'Base Currency': base_currency,
'Coin': coin,
'Direction': direction,
'Ask': ask,
'Target': target,
'Highest': highest,
'Lowest': lowest,
'Status': status,
'Close Time': close_time,
'DCA Level': dca_level
}
基本上,ID 都是正确的,因为它们都存在,而 close_time 并不总是存在,因此输出 CSV 会被截断。如果我不使用 ::text,则所有元素都会被占用。
例如:
Id,Issued At,Exchange,Base Currency,Coin,Direction,Ask,Target,Highest,Lowest,Status,Close Time,DCA Level
499762,01/12/2020 08:46:40,binance,USDT,CTK,LONG,1.208900000000,1.231802400000,9.975000000000,9.927000000000,open,01/12/2020 08:25:00,0
499837,01/12/2020 08:46:17,kraken,USD,AUD,LONG,0.737670000000,0.745784370000,0.000003860000,0.000003840000,open,01/12/2020 08:30:00,0
我想要的是保留/替换空值。
【问题讨论】:
-
我认为您不能使用
getall(),但如果没有看到您的response文本示例,我不确定。问题是,您遇到的问题是,例如:<id_num>.getall()返回 10 个元素,但<exchange>.getall()返回 9。好吧,您不知道丢失元素的位置。它可能是第一个,中间或最后。您需要“遍历”元素并查找某些属性,而不是执行getall() -
没错!您知道解决问题的任何方法吗?我应该浏览这些列表吗?
-
所以,我需要查看您正在解析的源以给出一个具体的例子......但一个通用的例子是:我对
scappy没有任何经验,但它看起来像可以将 DOM 表示为 python 对象。这意味着您可以沿着页面“行走”并在行走时构建您的结构。这将允许您拥有if this field doesn't exist, return "blank"和您认为合适的任何其他条件。那有意义吗?特别是,我会查看包含align-center类元素的元素并遍历它们。 -
可以通过这种方式解决,但我在想一个更少“pythonic”和更多“Scrapy”的解决方案。那我等别人回答
-
如果你想有人回答,你需要显示数据。目前你的问题只是你使用
zip()和不均匀的列表。您的列表不均匀,因为您使用 CSS 选择器来选择与特定模式匹配的元素。根据定义,由于有时值是空的,因此 CSS 选择器不会选择它们。 ...
标签: python-3.x web-scraping scrapy