【问题标题】:Python: Multiple white spaces remain after replacement?Python:替换后仍有多个空格?
【发布时间】:2020-08-08 04:55:10
【问题描述】:

从各个网站抓取文本后,我想规范化这段文本以便分析它。我想做的一个步骤是用一个空格替换多个空格。

我知道 Stack Overflow 上经常讨论这个话题。但是,使用常见的方式,例如:

string = ' '.join(string.split())

string = re.sub(' +', ' ', string)

似乎不会为每个网页产生预期的结果。请在下面找到我使用的代码摘录和美国证券交易委员会文件的示例,我无法做到没有多个空格。

import re
from selenium import webdriver

link = r"https://www.sec.gov/Archives/edgar/data/1800/000104746919001316/a2237648zdef14a.htm"
driver = webdriver.Chrome('./chromedriver')
driver.get(link)
x = driver.page_source

#Function to clean
def cleanhtml(raw_html):
    cleanr = re.compile('<.*?>')
    cleantext = re.sub(cleanr, '', raw_html)
    return cleantext

#Cleaning
x = str(x).replace('<', ' <')
x = cleanhtml(x)
x = x.replace('<br>', ' ').replace('&nbsp;', ' ').replace('&amp;', '&').replace('/\s\s+/g',' ').replace('•', ' ').replace("&lt", " ").replace("_", " ").replace("●", " ")
x = ' '.join(x.split())

#Results with persist to have multiple white spaces :-(
print(x)

注意:我刚刚编辑了我的问题,因为我之前的示例不合适!感谢您到目前为止的回答!

【问题讨论】:

  • white space != spacebar ... \t 或 \n 等也是空格。你是什​​么意思?你的正则表达式 f.e.只消除连续的 空格键 东西...
  • 你试过re.sub('\s+', ' ', string)(@PatrickArtner 的评论)吗?
  • 是否还有其他代码可以删除  标记和 HTML 元素?输入和预期输出到底是什么?
  • @MichaelMü 你能举一个你试图清理的 actual 字符串值的例子吗?给出的示例包含 html 标签(例如 cmets)。另外,如果您使用的是 html 解析器,我想我已经为您处理   ...
  • ...您没有使用 html 解析器(而不是使用正则表达式)是否有特殊原因?

标签: python web-scraping removing-whitespace


【解决方案1】:

因更改问题描述而更新: 您应该使用 html 解析器来处理标签和 html 实体。检索文本后,删除不需要的字符,例如 ndash、项目符号、多个空白字符:

import re
import bs4
from selenium import webdriver

link = r"https://www.sec.gov/Archives/edgar/data/1800/000104746919001316/a2237648zdef14a.htm"
driver = webdriver.Chrome('./chromedriver')
driver.get(link)
x = driver.page_source

soup = bs4.BeautifulSoup(x, 'html.parser')
text = soup.text

# you might also filter non-printable characters as explained here:
# https://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python
text = re.sub(r'[•●_—\u200B]+', ' ', text)

text = re.sub(r'\s+', ' ', text)
print(text)

【讨论】:

  • 非常感谢 - 这正是我所需要的!
【解决方案2】:

我会尝试做这样的事情:

clean = ' '.join([word.strip() for word in not_clean.strip().split()])

这样您不仅可以在空格处拆分,还可以清理每个拆分的单词和整个输入。

编辑:由于 OP 编辑​​了他们的问题,这个答案不再解决问题。

【讨论】:

    【解决方案3】:
    import re
    
    sample = '''<font color="#952369" size="1"><b>
    
    
    <!-- COMMAND= GRID_ADD,"background-color:#952369;" -->
    
    
     XXXXXXXXXXXXXXXXXXXXXXXXXXXXX&nbsp;&nbsp;</b></font>'''
    
    def replace(match):
        return ''
        
    sample = re.sub('\s+', replace, sample)
    
    print(sample)
    # Output:
    # <fontcolor="#952369"size="1"><b><!--COMMAND=GRID_ADD,"background-color:#952369;"-->XXXXXXXXXXXXXXXXXXXXXXXXXXXXX&nbsp;&nbsp;</b></font>
    

    【讨论】:

    • ....print(re.sub('\s+', '', sample)) 生成完全相同的输出而不通过使用函数增加额外的复杂性...
    • @mrxra 您实际上是对的,感谢您指出这一点! -.- 无论如何,我必须编辑或删除我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2021-07-21
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多