2017-07-29 89 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

相關問題