在Python中处理字符串时出现奇怪的引号
目前我正在使用scrapy,这是一个基于Python的网页爬虫框架。数据是通过XPATH从HTML中提取的。(我对Python还不太熟悉)为了整理数据,scrapy使用了“项目”,比如:
item = MyItem()
item['id'] = obj.select('div[@class="id"]').extract()
当我打印ID时,像这样使用print item['id']
,我得到的输出是:
[u'12346']
我的问题是,这个输出并不总是以相同的形式出现。有时候我得到的输出是:
"[u""someText""]"
这种情况只发生在文本上,但实际上这些文本和其他处理正常的文本没有什么特别之处,就像ID一样。
有没有人知道这些引号是什么意思?就像我说的,someText是和其他文本数据一样被抓取的,比如来自:
<a>someText</a>
有什么想法吗?
编辑:
我的爬虫会抓取一个博客的所有页面。这里是确切的输出:
[u'41039'];[u'title]
[u'40942'];"[u""title""]"]
...
提取方式:
item['title'] = site.select('div[@class="header"]/h2/a/@title').extract()
我注意到总是同样的博客文章有这些引号。所以它们并不是随机出现的。但这些文本没有什么特别之处。例如,这个标题会产生引号:
<a title="Xtra Pac Telekom web'n'walk Stick Basic für 9,95" href="someURL">
Xtra Pac Telekom web'n'walk Stick Basic für 9,95</a>
所以我最初的想法是这可能是因为某些特殊字符,但实际上并没有。
这种情况只在将项目写入CSV时发生,当我在命令行中打印它们时没有引号。
有什么想法吗?
1 个回答
在Python中,你可以用单引号'和双引号"来表示字符串。当它打印内容时,通常会选择单引号,但如果字符串里面有单引号,它就会用双引号来打印,以避免出现转义字符的问题。
所以通常情况下,它打印的格式是[u'....']
,但如果字符串里有'这个字符,它就会打印成[u"...."]
。
接下来,写入CSV文件时会有额外的复杂性。如果字符串里只有一个',它就会原样写入。所以[u'....']
会写成[u'....']
。
但是如果字符串里有双引号,那么(1)所有内容都会放在双引号里面,(2)任何双引号都会重复两次。所以u["..."]
会写成"[u""...""]"
。如果你用CSV库读取这些数据,它会自动识别并去掉这些重复的引号,所以不会造成任何问题。
所以这里的情况是,字符串里有单引号(让Python使用双引号)和CSV的引号规则(适用于双引号,但不适用于单引号)结合在一起。
如果这造成了问题,CSV库有各种选项可以改变这种行为 - http://docs.python.org/library/csv.html
维基百科页面详细解释了引号规则,这里用"Super, ""luxurious"" truck"
的例子展示了这种行为。