我有一堆网页文字,我想抓取并导出到csv文件。问题是文本在网站上分成多行,这就是美丽的读取方式。当我导出到csv时,所有文本都进入一个单元格,但单元格有多行文本。当我尝试将csv读入另一个程序时,它会以一种产生无意义数据集的方式解释多行。问题是,在我使用beautifulsoup但在导出到csv之前,如何将所有文本放入一行?
这是一个简单的工作示例,演示了多行的问题(实际上,生成的csv中的前几行是空白的,所以乍一看它可能看起来是空的):
import csv
import requests
from bs4 import BeautifulSoup
def main():
r = requests.get("https://www.econometricsociety.org/publications/econometrica/2017/03/01/search-yield")
soup = BeautifulSoup(r.text,"html.parser")
with open('Temp.csv', 'w', encoding='utf8', newline='') as f:
writer = csv.writer(f,delimiter=",")
abstract=soup.find("article").text
writer.writerow([abstract])
if __name__ == '__main__':
main()
更新:有一些很好的建议,但它仍然没有用。以下代码仍然生成一个csv文件,其中包含单元格中的换行符:
import csv
import requests
from bs4 import BeautifulSoup
with open('Temp.csv', 'w', encoding='utf8', newline='') as f:
writer = csv.writer(f,delimiter=',')
r = requests.get("https://www.econometricsociety.org/publications/econometrica/2017/03/01/search-yield")
soup = BeautifulSoup(r.text,'lxml')
find_article = soup.find('article')
find_2para = find_article.p.find_next_sibling("p")
find_largetxt = find_article.p.find_next_sibling("p").nextSibling
writer.writerow([find_2para,find_largetxt])
这是基于不同建议的另一次尝试。这个也最终在csv文件中产生换行符:
import csv
import requests
from bs4 import BeautifulSoup
def main():
r = requests.get("https://www.econometricsociety.org/publications/econometrica/2017/03/01/search-yield")
soup = BeautifulSoup(r.text,"html.parser")
with open('Temp.csv', 'w', encoding='utf8', newline='') as f:
writer = csv.writer(f,delimiter=",")
abstract=soup.find("article").get_text(separator=" ", strip=True)
writer.writerow([abstract])
if __name__ == '__main__':
main()
答案 0 :(得分:2)
将您的abstract = ...
行更改为:
abstract = soup.find("article").get_text(separator=" ", strip=True)
它将使用separator参数分隔每一行(在这种情况下,它将用空格分隔字符串。
答案 1 :(得分:1)
最终为我工作的解决方案非常简单:
abstract=soup.find("article").text.replace("\t", "").replace("\r", "").replace("\n", "")
摆脱了所有换行符。
答案 2 :(得分:0)
r = requests.get("https://www.econometricsociety.org/publications/econometrica/2017/03/01/search-yield")
soup = BeautifulSoup(r.text,'lxml') # I prefer using xml parser
find_article = soup.find('article')
# Next line how to find The title in this case: Econometrica: Mar 2017, Volume 85, Issue 2
find_title = find_article.h3
# find search yeild
find_yeild = find_article.h1
#first_paragraph example : DOI: 10.3982/ECTA14057 p. 351-378
find_1para = find_article.p
#second p example : David Martinez‐Miera, Rafael Repullo
find_2para = find_article.p.find_next_sibling("p")
#find the large text area using e.g. 'We present a model of the relationship bet...'
find_largetxt = find_article.p.find_next_sibling("p").nextSibling
我使用各种方法进入您希望用于教育目的的文本区域(您可以在每个方法上使用.text来获取没有标签的文本,或者您可以使用Zroq的方法。 但是你可以通过例如
将其中的每一个写入文件中writer.writerow(find_title.text)