用字符串"None"替换Scrapy.css返回的空值/空白数据

0 投票
2 回答
1134 浏览
提问于 2025-04-18 13:32

我在使用Python.org的2.7版本,64位的Windows Vista系统。我有一段代码,它可以从一个HTML表格的部分内容中创建一个字符串:

...

for row in rows

    incident = " ".join( row.css('.incidents-icon::attr(title)').extract() ).strip() + ','

    incident1 = str(incident) 
        if incident1 == "":
            incident1 = "None"

这个字符串incident1会和其他变量一起写入一个.csv文件。这个过程运行得很好,但有时候表格里没有返回结果,所以我想用“None”这个词来替代这些空值。

我也试过:

incident1 = str(incident) 
        if not incident1:
            incident1 = "None"

我知道在Stack Overflow上有很多关于空字符串或空值的例子,但那些答案似乎没有解决我的问题。在第一个例子中,代码执行得很好,但仍然返回了空字符串。在第二个例子中,代码没有正确执行。虽然没有报错,但程序没有遍历表格中的所有行,也没有写入输出到.csv文件。为了让你更明白,我的完整代码在下面:

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.utils.markup import remove_tags
from scrapy.cmdline import execute
import csv


class MySpider(Spider):

    name = "goal2"
    allowed_domains = ["whoscored.com"]
    start_urls = ["http://www.whoscored.com/Players/3859/Fixtures/Wayne-Rooney"]    

    def parse(self, response):
        sel = Selector(response)

        titles = sel.xpath("normalize-space(//title)")
        print 'titles:', titles.extract()[0]

        rows = sel.xpath('//table[@id="player-fixture"]//tbody//tr')

        for row in rows:

            print 'date:', "".join( row.css('.date::text').extract() ).strip()
            print 'result:', "".join( row.css('.result a::text').extract() ).strip()
            print 'team_home:', "".join( row.css('.team.home a::text').extract() ).strip()
            print 'team_away:', "".join( row.css('.team.away a::text').extract() ).strip()
            print 'info:', "".join( row.css('.info::text').extract() ).strip(), "".join( row.css('.info::attr(title)').extract() ).strip()
            print 'rating:', "".join( row.css('.rating::text').extract() ).strip()
            print 'incidents:', ", ".join( row.css('.incidents-icon::attr(title)').extract() ).strip()
            print '-'*40

            date = "".join( row.css('.date::text').extract() ).strip() + ','
            result = "".join( row.css('.result a::text').extract() ).strip() + ','
            team_home = "".join( row.css('.team.home a::text').extract() ).strip() + ','
            team_away = "".join( row.css('.team.away a::text').extract() ).strip() + ','
            info = "".join( row.css('.info::text').extract() ).strip() + ','
            rating = "".join( row.css('.rating::text').extract() ).strip() + ','
            incident = " ".join( row.css('.incidents-icon::attr(title)').extract() ).strip() + ','

            date1 = str(date)
            if date1 == "":
                date1 = "None"
            result1 = str(result)
            #if not result1:
                #result1 = "None"
            team_home1 = str(team_home)
            #if not home1:
                #home1 = "None"
            team_away1 = str(team_away)
            #if not team_away1:
                #team_away1 = "None"
            info1 = str(info)
            #if not info1:
                #info1 = "None"
            rating1 = str(rating)
            #if not rating1:
                #rating1 = "None"
            incident1 = str(incident) 
            if incident1 == "":
                incident1 = "None"

            mystring = date1 + result1 + team_home1 + team_away1 + info1 + rating1 + incident1 
            #print remove_tags(mystring).encode('utf-8')

            filepath = "C:\\Python27\\Football Data\\test" + ".txt"



            with open(filepath, "a") as f:
                f.write(mystring)
                f.close()



execute(['scrapy','crawl','goal2'])

我以为因为.css函数里有一个.strip()的实例,这样可以确保字段不会只返回空格。如果在表格的那一行没有找到匹配的数据,使用.css创建的变量会不会真的变成""呢?如果是的话,为什么我的第一个例子不工作?如果不是,我应该用什么语法呢?

谢谢

2 个回答

0

根据我的理解,你是想从CSS中获取一个属性,当它返回空字符串("")时,你希望它返回“None”。要实现这个,你需要这样做:

incident = row.css('.incidents-icon::attr(title)').get(default='None')

这样做的效果是,当结果为空时,它会返回一个默认值。

0

问题是我在字符串的末尾加了一个逗号(','),用来作为.csv文件中的分隔符。所以如果某个变量没有进球、助攻等情况,它的值就会变成逗号,而不是空字符串("")。我现在已经修改了这个逻辑。

撰写回答