Scrapy:新手尝试传递空值

1 投票
3 回答
913 浏览
提问于 2025-04-18 14:22

我在练习 scrapy 的时候遇到了一个问题,这里是我的代码:

class MySpider(Spider):   
name = "yahoochart"
start_urls = ["https://tw.movies.yahoo.com/chart.html"]
def parse(self, response):
    for sel in response.xpath('//tr'):
        ranking_list = sel.xpath("td[@class='c1']/span/text()").extract()
        print ranking_list 

输出结果是:

这里输入图片描述

我打印了 sel(下面的图片),我知道前面三行没有匹配到 sel.xpath("td[@class='c1']/span/text()").extract(),所以它会打印出三个空值 []。我想知道怎么写才能跳过这些空值(只打印出 [u'1'] [u'2']...[u'20'])?或者唯一的方法就是我得修改我的第一个选择器 response.xpath('//tr') 吗?请教教我,谢谢!

这里输入图片描述

3 个回答

0

这看起来是对你代码的一个简单修改。在打印 ranking_list 之前,先检查一下它是否为空。

for sel in response.xpath('//tr'):
    ranking_list = sel.xpath("td[@class='c1']/span/text()").extract()
    if ranking_list:
        print ranking_list 
0

你的代码应该这样工作:

1) for sel in response.xpath('//tr') 这行代码会从网页中获取所有的 tr 标签。

2) 对于上面获取的每一个标签,sel.xpath("td[@class='c1']/span/text()").extract() 会去查找 <td class="c1"> 标签,然后再找 <span> 标签,最后提取出 <span> 标签中的文本。

再检查一下网页的源代码,有3个 tr 标签并没有包含所有的 <td class="c1"><span> 标签(分别在第69行、第224行和第236行)。所以当你用 print 输出的时候,它们的值会是空的。

0

我不是Scrapy的专家,但看起来它是一个空列表,而不是'null'值(在Python中叫做None)。

你可以用下面的代码检查它的长度:

if ranking_list:
    print ranking_list 

或者

if len(ranking_list) > 0:
    print ranking_list 

撰写回答