【问题标题】:Clean unicode before adding to Dictionary在添加到字典之前清理 unicode
【发布时间】:2016-08-03 17:01:25
【问题描述】:

解析页面的时候,我在拉:

'label_value': [u'\n\t\t\t\t\t\t\t\t\t\tabc123\n\t\t\t\t\t\t\t\t\t']}

我的目标是在写入 CSV 时从该 xpath 中提取相关的“abc123”。目前,由于字符串中的“\n\t”,它没有写入任何内容。环顾四周,我找到了几种方法来实现这一点,但我无法将其正确地放置在我自己的代码中并使其正确执行。

我一直在使用正则表达式和 .translate() 来删除 \n\t 的实例并清理代码以将其干净地添加到 csv 中。我在正则表达式方面没有取得太大成功,因为这些都是作为列表的拉动,所以我放弃了使用 .translate()。

下面,我添加了用于定义 xpath 和实际页面解析的代码。在启动蜘蛛和解析初始页面之间有一个步骤,但我没有发现与这个问题相关,所以在代码中省略了它。

在以下部分中,我想在哪里添加此代码?是在我在初始蜘蛛中定义 label_value 的 xpath 时,还是在我实际将其提取到我的 ResultsDict 时?

label_value = './/*[@class="lorem-ipsum"]

改为使用...

label_value = './/*[@class="lorem-ipsum"].translate(None, '\t\n ')

或者...

def parsepage(self, response)
    time.sleep(2)
    self.driver.get(response.url)
    selectable_page = Selector(text=self.driver.page_source)
    ResultsDict = scraperpageitems()
    ResultsDict['label_value'] = selectable_page.xpath(label_value).extract()

改为使用...

    ResultsDict['label_value'] = selectable_page.xpath(label_value).extract().translate(None, '\t\n ')

【问题讨论】:

  • 您能否澄清\n\t 是否可以出现在想要的结果字符串中。即字符串可以像这样:\n\t\t\tabc\n\t123\n\t\t\t\t,如果是,那么预期的行为是什么?
  • 我希望它尽可能干净,所以只有 'abc123',没有多余的文字。
  • 这不能回答问题。所需文本中可以有换行符吗?例如,文本可能来自多行文本框,并且可能希望保留用户输入的格式,并且仅在用户输入之前和之后去除周围的制表符和换行符。
  • 这不是你的问题,但不,这些都是单行的。

标签: python regex xpath


【解决方案1】:

你不是在找strip()吗?
考虑这个例子(见working on ideone.com

label_value = '''


                                abc123


'''
print(label_value)
print(label_value.strip())


对于记录,这起到了作用:
[x.strip() for x in selectable_page.xpath(label_value).extract()]

【讨论】:

  • .strip() 会在代码中的什么位置出现?我已经在几个方面进行了尝试,但它们都带有额外的空格,并且 \n\t 仍然存在。 selectable_page.xpath(label_value.strip()).extract() selectable_page.xpath(label_value).strip().extract()
  • selectable_page.xpath(label_value).extract().strip()
  • AttributeError: 'list' object has no attribute 'strip' 这是我遇到的主要问题。我想知道我是否需要在代码中更快地遍历条带......
  • 这是scrapy 吗?您可以改用 extract_first() 或使用列表推导。
  • 列表理解:[x.strip() for x in selectable_page.xpath(label_value).extract()]
【解决方案2】:

可能最好的方法是修剪空格。

像做一个全局的东西
查找^\s+|\s+$
并一无所有。

您提到了剥离 Unicode。
如果您也想去除 Unicode,请使用 ^\s+|[\x{100}-\x{10ffff}]+|\s+$
不确定 Python 在类中对 Unicode 使用什么,请使用任何形式
他们根据需要提供\uXXXX\UXXXXXX 和大括号{}

【讨论】:

  • 最好的方法是使用strip() :)
  • 只要去掉空格就可以。
  • 引用官方strip()doc:If chars is omitted or None, whitespace characters are removed.
  • 所以他们必须使用正则表达式或其他东西。
【解决方案3】:

我感谢 @Martjin 这个解决方案...(我感谢评论)

#UNICODE is a pain in my ass! below is a function to strip-out and replace with a space.
def remove_non_ascii(text):
    return ''.join([i if ord(i) < 128 else ' ' for i in text])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2013-08-21
    • 2011-02-17
    相关资源
    最近更新 更多