【问题标题】:python strip function not working properlypython条功能无法正常工作
【发布时间】:2014-03-28 08:40:16
【问题描述】:

我正在通过 python 从网站上抓取一些数据。

我想做两件事

  1. 我想跳过每个网页抓取结果中常见的前两个单词“Dubai”和“UAE”。

  2. 我想将最后两个单词保存在两个不同的变量中,带条不带多余的空格。

        try:
            area= soup.find('div', 'location')
            area_result= str(area.get_text().strip().encode("utf-8"))
            print "Area: ",area_result
    except StandardError as e:
            area_result="Error was {0}".format(e)
            print area_result
    

area_result:包含以下数据:

'UAE \xe2\x80\xaa>\xe2\x80\xaa\n            \n                Dubai \xe2\x80\xaa>\xe2\x80\xaa\n            \n                Business Bay \xe2\x80\xaa>\xe2\x80\xaa\n            \n                Executive Towers \n            \n\n\n        \n\n\n\t    \n\t        \n\t    \n\t\n\n\n        \n        ;\n        \n            \n                \n                    1.4 km from Burj Khalifa Tower'

我希望将上述结果显示为(注意Executive Towers1.4 km.. 之间的>

Executive Towers > 1.4 km from Burj Khalifa Tower

【问题讨论】:

  • 您能否以原始格式而不是屏幕截图向我们展示字符串?像这样:UAE >\n Dubai >\n ...?还有strip() 是为了去掉字符串开头和结尾的东西,
  • 查看修改后的版本
  • 您的浏览器也不会显示多余的空格。
  • @user3265370 你还没有给我们 STRING,你给我们的是我们不感兴趣的屏幕截图.. 你能复制并粘贴字符串吗按原样而不是发布屏幕截图,因为我对为什么有多个 \n 和 ` ` 遍布您的数据以及原始数据的样子很感兴趣,我也想复制并粘贴它数据到我的环境中,以便我可以使用它。我无法从屏幕截图中复制字符串。 注意: 最后一个屏幕截图与第一个屏幕截图不匹配,第一个屏幕截图中没有Dubai Festival City;,即使这并不重要。一致性!
  • 请查看修改后的版本

标签: python web-scraping strip


【解决方案1】:
area_result = area_result.replace("UAE", "")
area_result = area_result.replace("Dubai", "")
area_result =  area_result.strip()

使用正则表达式:

import re
area_result = re.sub('\s+',' ',area_result)
area_result = area_result.replace("UAE ‪>‪ Dubai ‪>‪", "")
area_result =  area_result.strip()

【讨论】:

    【解决方案2】:
    import string
    def cleanup(s, remove=('\n', '\t')):
        newString = ''
        for c in s:
            # Remove special characters defined above.
            # Then we remove anything that is not printable (for instance \xe2)
            # Finally we remove duplicates within the string matching certain characters.
            if c in remove: continue
            elif not c in string.printable: continue
            elif len(newString) > 0 and c == newString[-1] and c in ('\n', ' ', ',', '.'): continue
            newString += c
        return newString
    

    为了清理你的代码,把类似的东西扔进去?
    最终结果是:

    >>> s = 'UAE \xe2\x80\xaa>\xe2\x80\xaa\n            \n                Dubai \xe2\x80\xaa>\xe2\x80\xaa\n            \n                Business Bay \xe2\x80\xaa>\xe2\x80\xaa\n            \n                Executive Towers \n            \n\n\n        \n\n\n\t    \n\t        \n\t    \n\t\n\n\n        \n        ;\n        \n            \n                \n                    1.4 km from Burj Khalifa Tower'
    >>> cleanup(s)
    'UAE > Dubai > Business Bay > Executive Towers 1.4 km from Burj Khalifa Tower'
    

    这是对 string 库的很好的 SO 参考。

    回到问题是看到用户不希望前两个块(> 之间)出现,很简单:

    area_result = cleanup(area_result).split('>')[3].replace(';', '>')
    

    【讨论】:

    • 我想要一些可以放在我已经编写的代码行块中的东西
    • @user3265370 你把它放在代码的顶部,你所要做的就是:print "Area: ",cleanup(area_result)
    • 完成。但结果仍然没有很好的格式。请检查编辑版本中的结果
    • @user3265370 请发布我要您发布的内容,而不是自己发布的数据版本...因为看起来您那里有 unicode 字符需要删除...
    • 很抱歉,您到底想让我发布什么?
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2013-11-06
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多