2017-07-29 374 views
-1

我正尝试使用请求和Python中的美丽汤4从Zomato的一个页面中提取评论。我想将请求页面的链接和提取的评论存储到一个csv文件中。如何在csv中使用Python将字符串写入一个单元格?

我的问题是,我提取的评论不存储到一个单元格中,而是分成多个单元格。如何将提取的评论存储到一个单元格中?

这里是我的代码:

import time 
from bs4 import BeautifulSoup 
import requests 

URL = "https://www.zomato.com/review/eQEygl" 
time.sleep(2) 
reviewPage = requests.get(URL, headers = {'user-agent': 'my-app/0.0.1'}) 
reviewSoup = BeautifulSoup(reviewPage.content,"html.parser") 
reviewText = reviewSoup.find("div",{"class":"rev-text"}) 
textSoup = BeautifulSoup(str(reviewText), "html.parser") 

reviewElem = [URL, ""] 
for string in textSoup.stripped_strings: 
     reviewElem[1] += string 

csv = open("out.csv", "w", encoding="utf-8") 
csv.write("Link, Review\n") 
row = reviewElem[0] + "," + reviewElem[1] + "\n" 
csv.write(row) 

csv.close() 

Output

Expected Output

+0

可悲的是,你实际上是遵循手动解决方法,而不是一个可靠的和Python的解决方案。让我们来看看当评论包含双引号时会发生什么。 – alecxe

回答

0

我认为这个问题是嵌入在reviewElem[1]字符串逗号,因为他们在最CSV软件默认的分隔符。下面通过包装字符串的内容"字符可以避免这个问题,表示这一切都一个单元:

import time 
from bs4 import BeautifulSoup 
import requests 

URL = "https://www.zomato.com/review/eQEygl" 
time.sleep(2) 
reviewPage = requests.get(URL, headers = {'user-agent': 'my-app/0.0.1'}) 
reviewSoup = BeautifulSoup(reviewPage.content,"html.parser") 
reviewText = reviewSoup.find("div",{"class":"rev-text"}) 
textSoup = BeautifulSoup(str(reviewText), "html.parser") 

reviewElem = [URL, ""] 
for string in textSoup.stripped_strings: 
    reviewElem[1] += string 

csv = open("out.csv", "w", encoding="utf-8") 
csv.write("Link, Review\n") 
#row = reviewElem[0] + "," + reviewElem[1] + "\n" 
row = reviewElem[0] + ',"{}"\n'.format(reviewElem[1]) # quote string 2 
csv.write(row) 

csv.close() 
0

无需手动构建一个CSV字符串。当您手动执行此操作时,如果列值内有列分隔符(默认情况下为,),则它们将被解释为分隔符,而不是文字字符串,从而导致列值分散在多个列周围。

使用csv模块和.writerow()方法:

import csv 

# ... 

with open("out.csv", "w", encoding="utf-8") as csv_file: 
    writer = csv.writer(csv_file) 

    writer.writerow(["Link", "Review"]) 
    writer.writerow(reviewElem) 
+0

我得到这样的错误“TypeError:'fieldnames'是一个无效的关键字参数为这个函数”使用你的代码。 –

+0

@JustinManalili好吧,让我们使用'writerow',试试看。 – alecxe

相关问题