我在尝试从网站上抓取文字后写一个CSV文件。我已经找到了这个答案:How can write scraped content to a CSV file?但它并没有解决我的问题。
问题是我在写完CSV文件后只有一行。
这是我目前的代码(我使用了bs4
和mechanize
):
from bs4 import BeautifulSoup
import mechanize
url = "https://www.contratos.gov.co/consultas/detalleProceso.do?numConstancia=15-12-3634534"
br = mechanize.Browser()
search = br.open(url)
# Browser options
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Firefox')]
response = search.read()
soup = BeautifulSoup(response, 'lxml')
text = soup.findAll('td', {'class': 'tablaslistOdd'})
for t in text:
result = t.text.replace("\t", "").replace("\r", "").replace('\n', '')
newResult = result.encode('utf-8')
#print newResult
for line in newResult:
output = open('data/myCSVfile.csv', 'w')
output.write(newResult)
output.close()
我正在寻找的是为每一行文本写一个CSV列。 这可能吗? 任何解决问题的建议都值得赞赏!
答案 0 :(得分:1)
问题是,每次关闭文件并打开文件时,它都会重写文件中的内容。所以你不需要关闭它。例如,编写csv的代码可能如下所示:
with open('data/myCSVfile.csv', 'w') as f:
for line in newResult:
f.write(newResult + '\n')
顺便说一句,with
语句允许您不关心关闭文件 - 它会为您关闭它。使用它是一种很好的做法,因为它可以使您的代码更清晰,并在您不需要它后立即关闭文件。
要获得您想要的格式,请尝试以下操作:
import csv
lines = []
for t in soup.findAll('td', {'class': 'tablaslistOdd'}):
text = t.text.replace("\t", "").replace("\r", "").replace('\n', '').encode('utf-8')
lines.append(text)
with open('myCSVfile.csv', 'w') as f:
writer = csv.writer(f, delimiter=',')
writer.writerow(lines)