目前我正在使用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中打印它们时没有引号。
有什么想法吗?
答案 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"