beautifulsoup to csv:将文本段落放入一行

时间:2017-05-01 19:00:52

标签: python csv beautifulsoup

我有一堆网页文字,我想抓取并导出到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()

3 个答案:

答案 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)