Python: 替换后还有多个空格?

Python: Multiple white spaces remain after replacement?

从各个网站抓取文本后,我想规范化此文本以便对其进行分析。我想做的一步是用一个白色 space.

替换多个白色 spaces

我知道这个话题在 Stack Overflow 上经常被提及。但是,使用常见的方式,如:

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

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

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

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)

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

我会尝试做类似的事情:

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

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

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

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>

由于更改了问题描述而更新: 您应该使用 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:
# 
text = re.sub(r'[•●_—\u200B]+', ' ', text)

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