在Python中处理字符串时出现奇怪的引号

2 投票
1 回答
1131 浏览
提问于 2025-04-17 01:08

目前我正在使用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 个回答

5

在Python中,你可以用单引号'和双引号"来表示字符串。当它打印内容时,通常会选择单引号,但如果字符串里面有单引号,它就会用双引号来打印,以避免出现转义字符的问题。

所以通常情况下,它打印的格式是[u'....'],但如果字符串里有'这个字符,它就会打印成[u"...."]

接下来,写入CSV文件时会有额外的复杂性。如果字符串里只有一个',它就会原样写入。所以[u'....']会写成[u'....']

但是如果字符串里有双引号,那么(1)所有内容都会放在双引号里面,(2)任何双引号都会重复两次。所以u["..."]会写成"[u""...""]"。如果你用CSV库读取这些数据,它会自动识别并去掉这些重复的引号,所以不会造成任何问题。

所以这里的情况是,字符串里有单引号(让Python使用双引号)和CSV的引号规则(适用于双引号,但不适用于单引号)结合在一起。

如果这造成了问题,CSV库有各种选项可以改变这种行为 - http://docs.python.org/library/csv.html

维基百科页面详细解释了引号规则,这里用"Super, ""luxurious"" truck"的例子展示了这种行为。

撰写回答