【问题标题】:python scrapy how to remove extra parsed characterpython scrapy如何删除多余的解析字符
【发布时间】:2012-05-02 01:22:41
【问题描述】:

在使用scrapy的解析过程中,我发现了这个输出

[u'TARTARINI AUTO SPA (CENTRALINO SELEZIONE PASSANTE)'],"[u'V. C.BONAZZI\xa043', u'40013', u'CASTEL MAGGIORE']",[u'0516322411'],[u' info@tartariniauto.it'],[u'CARS (LPG INSTALLERS)'],[u'track.aspx?id=0&url=http://www.tartariniauto.it']

如您所见,还有一些额外的字符,例如

你'\xa043“'[]

我不想要的。 我怎样才能删除这些? 此外,此字符串中有 5 个项目。我希望字符串看起来像这样:

item1、item2、item3、item4、item5

这是我的 pipelines.py 代码

from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose, Join
import re
import json
import csv

class InfobelPipeline(object):
    def __init__(self):
      self.file = csv.writer(open('items.csv','wb'))
    def process_item(self, item, spider):
      name = item['name']
      address = item['address']
      phone = item['phone']
      email = item['email']
      category = item['category']
      website = item['website']
      self.file.writerow((name,address,phone,email,category,website))
    return item

谢谢

【问题讨论】:

  • 只需遍历您的字符串并删除 A)当您 str() 它时会引发错误的每个字符或 B)高于某个序数的每个字符。
  • @JoelCornett 非常不符合 Python 风格
  • 我担心你在问如何删除方括号和引号之类的东西?也就是说,您是在询问如何从其封装列表中删除字符串,或者您已将它们输出到外部文件并重新读取它们?在我看来,所有这些工作都应该在你的项目加载器中完成,而不是在你的管道中。
  • @Edwardr:那么你建议应该怎么做呢?我保证您提出的任何解决方案都将涉及我刚才提到的内容。它是或不是pythonic的程度仅取决于用于执行此操作的内置函数的组合。
  • @JoelCornett 抱歉,我不是说非常。我的意思是 - 为什么在 "data".encode('ascii', error='ignore') 可以添加额外的循环?

标签: python scrapy


【解决方案1】:

您看到的额外字符是 unicode 字符串。如果你在网上抓取,你会经常看到它们。常见示例包括版权符号:© unicode point U+00A9,或商标符号™ unicode point U+2122

删除它们的最快方法是尝试将它们编码为 ascii,然后如果它们不是 ascii 字符(它们都不是)则将它们丢弃

>>> example = u"Xerox ™ printer"
>>> example
u'Xerox \u2122 printer'
>>> example.encode('ascii')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 6: ordinal 
not in range(128)
>>> example.encode('ascii', errors='ignore')
'Xerox  printer'
>>>

如您所见,当您尝试将符号解码为 ascii 时,它会引发 UnicodeEncodeError,因为该字符无法用 ascii 表示。但是,如果您添加 errors='ignore' 关键字参数,那么它将简单地忽略它无法编码的符号。

【讨论】:

  • 这是编辑后的code 工作正常。但显示了这个error 一次。
  • @MarufRahman an IndexError at position 0 表示数组为空。如果 item 的行为类似于内置 dict,我不记得 Scrapy Items 是否这样做,那么您可以将每行的 item['xx'][0] 替换为 item.get('xx', [''])
  • 这对我来说有点粗鲁。无论如何 + 1 的答案。
  • @MarufRahman 抱歉,我在示例中遗漏了一对括号。 website = item.get('website', [''])[0].encode('ascii',errors='ignore') 是你想要的。如果最终是这样,请随意将我的答案标记为正确。 ;-)
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 2020-07-30
  • 2022-12-16
  • 1970-01-01
  • 2015-08-22
  • 2018-11-10
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多