无法从BeautifulSoup文本输出(Python 2.7.5)中删除换行符

8

我正在尝试编写一个程序来解析一系列HTML文件,并将结果数据存储在.csv电子表格中,这个过程非常依赖于换行符在正确的位置。我已经尝试了所有我能找到的方法来删除某些文本中的换行符,但都没有成功。相关代码如下:

soup = BeautifulSoup(f)
ID = soup.td.get_text()
ID.strip()
ID.rstrip()
ID.replace("\t", "").replace("\r", "").replace("\n", "")
dateCreated = soup.td.find_next("td").get_text()
dateCreated.replace("\t", "").replace("\r", "").replace("\n", "")
dateCreated.strip()
dateCreated.rstrip()
# debug
print('ID:' + ID + 'Date Created:' + dateCreated)

生成的代码如下:

ID:
FOO
Date Created:
BAR

这个程序和另一个问题一直让我抓狂。如果能得到帮助就太好了。谢谢。
编辑:我解决了这个问题,原来是一个非常愚蠢的错误。我只需要在结尾加上

即可。
ID.replace("\t", "").replace("\r", "").replace("\n", "")

我本应该完成的任务

ID = ID.replace("\t", "").replace("\r", "").replace("\n", "")

1
尝试打印repr(ID)以查看其中可能包含的字节?否则,可以尝试使用字符串格式化代替连接? - g.d.d.c
打印 repr(ID) 和 repr(dateCreated) 给了我 u'\nFOO\n',u'\nBAR\n'。我已经尝试将替换设置为(u"\n", u""),但那没起作用。 - Ben Forde
4个回答

6

您面临的问题是,您期望的是原地操作,但实际上这些操作返回的是新值。

ID.strip() # returns the rstripped value, doesn't change ID.
ID = ID.strip() # Would be more appropriate.

你可以使用正则表达式,但实际上这个过程并不需要用到正则表达式。如果只是去掉开头和结尾的字符,那么直接使用strip函数即可:

ID = ID.strip('\t\r\n')

4

BeautifulSoup4中有一种内部实现的剥离字符串(Stripped Strings)

这些字符串通常具有大量额外的空白,在使用.stripped_strings生成器时可以将其移除: BS4文档stripped_strings

html_doc="""<div class="path">
    <a href="#"> abc</a>
    <a href="#"> def</a>
    <a href="#"> ghi</a>
</div>"""

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, "html.parser")

result_list = []
for s in soup.select("div.path"):
    result_list.extend(s.stripped_strings)

print  " ".join(result_list)

Output: abc def ghi

3

虽然这个问题已经在某种程度上得到了回答,但我想说的是,没有太大的理由以那种冗长的方式进行替换,实际上你可以这样做:

import re

ID = re.sub(r'[\t\r\n]', '', ID)

即使正则表达式通常应该避免使用。

1
遇到了这个问题。其他的解决方案看起来很复杂,或者没有完全解决问题。这个一行代码就可以解决:
' '.join(re.split(r'[ \n\t]+',soup.text))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接