我在Windows Vista 64位上使用Python.org版本2.7 64位。我有以下代码提取,它从HTML表的一部分的内容创建一个字符串:
...
for row in rows
incident = " ".join( row.css('.incidents-icon::attr(title)').extract() ).strip() + ','
incident1 = str(incident)
if incident1 == "":
incident1 = "None"
字符串incident1随后将其与其他变量一起写入.csv文件。这一切都很好,但是有时候没有从表中返回任何结果,所以我想用“无”一词替换它们。
我也尝试过:
incident1 = str(incident)
if not incident1:
incident1 = "None"
我意识到有关于空字符串或空字符串的问题的Stack Overflow有几个例子,但是给出的答案似乎并没有解决我的问题。在第一个示例中,代码执行正常,但仍返回null / blank字符串。在第二个代码中,代码无法正确执行。它没有错误,但程序不会迭代表中的所有行,也不会将输出写入.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创建的变量是否会解析为“”?是这样,为什么我的第一个例子不起作用?如果没有,我应该使用什么语法?
由于
答案 0 :(得分:0)
问题是我在字符串的末尾添加一个','作为.csv文件中的分隔符,因此没有目标或助攻等的变量将解析为“,”而不是“ ”。我现在修改了逻辑。
答案 1 :(得分:0)
据我了解,您正在尝试从css访问属性,并且该属性返回(“”)时,您希望它返回“ None”而不是这种情况,在这种情况下,您需要做的是:
incident = row.css('.incidents-icon::attr(title)').get(default='None')
此操作将在结果为空时返回默认值