【问题标题】:A newline/linebreak issue when writing parsed text to .csv file in python3在 python3 中将解析的文本写入 .csv 文件时出现换行符/换行符问题
【发布时间】:2018-11-21 15:52:03
【问题描述】:

在使用 BeautifulSoup 解析从 html 中提取的文本并将其写入 .csv 文件时遇到问题。

使用标题日期描述信息

等数据解析页面

我有一个 Description 文本示例,其中包含从网页解析的确切结构。它有那些
标签和双空格:

<p>Hello World <br/>
<br/>
Key points <br/>
<br/>
 -  Point number one  <br/>
 -  Point number two    <br/>
 -  Point number three  </p>

所以我设法使用 .text.strip() 将其提取为文本,现在是:

Hello World 

Key points 

 -  Point number one  
 -  Point number two    
 -  Point number three  

然后我想将结果保存到 .csv 文件中,每个结果都保存到一个新单元格中:

Title, Date, Description, Info
Title, Date, Description, Info
Title, Date, Description, Info

为此,我正在创建一个文件,设置标题并开始使用 FOR 循环写入它

filename = "scraping.csv"
f = open(filename, "w")

headers = "Title, Date, Description, Info\n"
f.write(headers)
for article in articles:
    ...
    f.write(title + "," + date + "," + description + "," + info + "\n")
f.close()

最后我得到的是包含所有信息的 .csv 文件。 问题是当 description 被传递给文件时,它会破坏所有行。

Title, Date, 
Des
crip
tion, Info
Title, Date, 
Des
crip
tion, Info    
Title, Date, 
Des
crip
tion, Info

如果我写入文件,除了 description 之外的一切都很好。

如何将此说明保存到单元格并忽略所有不需要的换行符/换行符?

更新
根据 @ewwink 的建议,这种组合有助于删除不需要的换行符

description = re.sub(r"[\r\n]+", " ", description)

不幸的是,它在一行中打印到 .csv 文件的单元格中,没有进行格式化。但是我可以通过替换 \r\n

在 .csv 文件中使用不可见的 pilcrow 符号制作换行符
pilcrow = """
    """
description = re.sub(r"[\r\n]+", pilcrow, description)

【问题讨论】:

  • 可能有点难看,但现在您尝试f.write(title.strip() + "," + date.strip() + "," + description.strip() + "," + info.strip() + "\n") 以确保各个字符串确实没有所有换行符吗?
  • 在将其写入文件之前,您可以打印描述吗?
  • 是的,它会很好,没有标签,只是带有格式的文本
  • @Guimute,文本已从列表str(description[0].text.strip()) 传递,但没有帮助
  • 不错的发现,只是知道可能上次我尝试错误来自未加引号的引号。但秘密仍然是双引号,试试你可以删除正则表达式替换行。

标签: python-3.x macos csv web-scraping beautifulsoup


【解决方案1】:

要将其保存为.csv 文件,您需要将值双引号,因此如果存在,,它不会破坏您的csv 列并使用"" 转义"

for article in articles:
    ...
    # description = re.sub(r"[\r\n]+", " ", description)
    description = description.replace('"', '""')
    rows = '"%s","%s","%s","%s"\n' % (title, date, description, info)
    f.write(rows)

【讨论】:

  • 谢谢ewwink,你的建议很有帮助!我修改了我的代码并尝试运行它,现在我的 .csv 文件几乎正确。它确实删除了不需要的换行符,但现在它(描述块)写在一行中......有没有办法在每个单元格中保持格式?我有带项目符号的文本,并希望保持原样,而不是手动更正
  • 你不能在 csv 中有新行,但 xls 可以。也许您可以稍后在需要时将换行符替换为换行符。
  • 再次感谢您的建议,我设法在我的 .csv 文件中添加了换行符,并用解决方案更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多