BeautifulSoup 将不需要的换行符添加到字符串 Python3.5

Posted

技术标签:

【中文标题】BeautifulSoup 将不需要的换行符添加到字符串 Python3.5【英文标题】:BeautifulSoup adding unwanted linebreaks to strings Python3.5 【发布时间】:2017-01-07 07:19:42 【问题描述】:

我一直在处理使用 BeautifulSoup .find 函数获取的字符串中似乎隐藏的换行符时遇到了一些问题。我的代码扫描了一个 html 文档,并提取出名称、标题、公司和国家作为字符串。我输入检查并看到它们是字符串,当我打印它们并检查它们的长度时,一切似乎都是正常的字符串。但是,当我在 print("%s is a %s at %s in %s" % (name,title,company,country))outputWriter.writerow([name,title,company,country]) 中使用它们写入 csv 文件时,我会得到额外的换行符,这些换行符似乎不存在于字符串中。

发生了什么事?或者谁能​​指出我正确的方向?

我是 Python 新手,不知道在哪里查找我不知道的所有内容,所以在花了一整天试图解决问题后,我在这里问。我搜索了谷歌和其他几篇关于剥离隐藏字符的堆栈溢出文章,但似乎没有任何效果。

import csv
from bs4 import BeautifulSoup

# Open/create csvfile and prep for writing
csvFile = open("attendees.csv", 'w+', encoding='utf-8')
outputWriter = csv.writer(csvFile)

# Open HTML and Prep BeautifulSoup
html = open('WEB SUMMIT _ LISBON 2016 _ Web Summit Featured Attendees.html', 'r', encoding='utf-8')
bsObj = BeautifulSoup(html.read(), 'html.parser')
itemList = bsObj.find_all("li", "class":"item")

outputWriter.writerow(['Name','Title','Company','Country'])

for item in itemList:
    name = item.find("h4").get_text()
    print(type(name))
    title = item.find("strong").get_text()
    print(type(title))
    company = item.find_all("span")[1].get_text()
    print(type(company))
    country = item.find_all("span")[2].get_text()
    print(type(country))
    print("%s is a %s at %s in %s" % (name,title,company,country))
    outputWriter.writerow([name,title,company,country])

【问题讨论】:

我解决了我的问题,尝试了一个过滤器。 def filter_non_printable(str): return ''.join([c for c in str if ord(c) > 31 or ord(c) == 9]) 【参考方案1】:

您很可能需要去除空白,您的代码中没有添加它的任何内容,因此它必须存在:

outputWriter.writerow([name.strip(),title.strip(),company.strip(),country.strip()])

您可以通过查看 repr 输出来验证我们那里的内容:

print("%r is a %r at %r in %r" % (name,title,company,country))

当您 print 时,您会看到 str 输出,因此如果有换行符,您可能没有意识到它的存在:

In [8]: s = "string with newline\n"

In [9]: print(s)
string with newline


In [10]: print("%r" % s)
'string with newline\n'

difference-between-str-and-repr-in-python

如果换行符实际上嵌入到字符串的正文中,则需要替换,即name.replace("\n", " ")

【讨论】:

谢谢!正如我在上一条评论中感到难过的那样,我尝试了另一种解决方案并发现它有效。我仍然不确定一切的方式或原因,但我正在慢慢学习。再次感谢!

以上是关于BeautifulSoup 将不需要的换行符添加到字符串 Python3.5的主要内容,如果未能解决你的问题,请参考以下文章

Beautifulsoup - get_text,单行输出

python beautifulsoup将属性添加到没有值的标签

如何在python中忽略BeautifulSoup解析器中的换行符

如何在没有多余换行符的情况下从 BeautifulSoup 输出 XML?

PHP / JS;将不可见的换行符或换行符转换为html标记以进行打印

使用 beautifulsoup 提取换行符之间的文本(例如 <br /> 标签)