在python中使用字符串会产生奇怪的引号

时间:2011-09-01 18:13:19

标签: python xpath

目前我正在使用scrapy,这是一个基于python的网络抓取框架。使用 XPATH 从html中提取数据。 (我是python的新手)要包装数据,scrapy使用的是项目,例如

item = MyItem()

item['id'] = obj.select('div[@class="id"]').extract()

当像print item['id']那样打印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时才会发生这种情况,当我在cmd中打印它们时没有引号。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

python可以同时使用单个'和双引号作为引号。当它打印出来的东西时,它会正常选择单引号,但如果是,则会切换为双引号它打印的文本包含单引号(以避免必须转义字符串中的引号):

通常情况下,它正在打印[u'....'],但有时您的文字包含'字符,然后会打印[u"...."]

然后有一个额外的复杂性写入csv。如果将一个字符串写入仅包含'的csv,则按原样写入。因此[u'....']写为[u'....']

但如果它包含双引号,则(1)所有内容都放在双引号内;(2)任何双引号重复两次。因此u["..."]写为"[u""...""]"。如果你用csv库读回csv数据,那么这将被检测并删除,所以它不会引起任何问题。

所以它是包含单引号(使python使用双引号)和csv引用规则(适用于双引号但不适用于单引号)的文本的组合。

如果这是一个问题,csv库有各种更改行为的选项 - http://docs.python.org/library/csv.html

wikipedia page更详细地解释了引用规则 - 此处的行为由"Super, ""luxurious"" truck"

示例显示