Python 将多行写入CSV文件

Python 将多行写入CSV文件,python,csv,web-scraping,Python,Csv,Web Scraping,我正在尝试使用python将多行写入CSV文件,我已经在编写这段代码一段时间了,以拼凑如何做到这一点。我在这里的目标只是使用牛津词典网站,并将每年创建的单词和年份刮到一个csv文件中。我希望每一行从我搜索的年份开始,然后水平列出所有单词。然后,我希望能够重复多年 以下是我目前的代码: import requests import re import urllib2 import os import csv year_search = 1550 subject_search = ['Law']

我正在尝试使用python将多行写入CSV文件,我已经在编写这段代码一段时间了,以拼凑如何做到这一点。我在这里的目标只是使用牛津词典网站,并将每年创建的单词和年份刮到一个csv文件中。我希望每一行从我搜索的年份开始,然后水平列出所有单词。然后,我希望能够重复多年

以下是我目前的代码:

import requests
import re 
import urllib2
import os
import csv

year_search = 1550
subject_search = ['Law'] 

path = '/Applications/Python 3.5/Economic'
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)

user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
header = {'User-Agent':user_agent}
request = urllib2.Request('http://www.oed.com/', None, header)
f = opener.open(request)  
data = f.read()
f.close()
print 'database first access was successful'

resultPath = os.path.join(path, 'OED_table.csv')
htmlPath = os.path.join(path, 'OED.html')
outputw = open(resultPath, 'w')
outputh = open(htmlPath, 'w')
request = urllib2.Request('http://www.oed.com/search?browseType=sortAlpha&case-insensitive=true&dateFilter='+str(year_search)+'&nearDistance=1&ordered=false&page=1&pageSize=100&scope=ENTRY&sort=entry&subjectClass='+str(subject_search)+'&type=dictionarysearch', None, header)
page = opener.open(request)
urlpage = page.read()
outputh.write(urlpage)
new_word = re.findall(r'<span class=\"hwSect\"><span class=\"hw\">(.*?)</span>', urlpage)
print str(new_word)
outputw.write(str(new_word))
page.close()
outputw.close()
我使用了
csv
模块作为代码第二部分的参考


为了澄清这一点,我加入了代码的第一部分,以提供透视图。

您真的不应该用正则表达式解析html。也就是说,下面是如何修改代码以生成包含所有找到单词的csv文件

注意:由于未知原因,结果字列表的长度在每次执行中都有所不同

import csv
import os
import re
import requests
import urllib2

year_search = 1550
subject_search = ['Law']

path = '/Applications/Python 3.5/Economic'
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)

user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
header = {'User-Agent':user_agent}

# commented out because not used
#request = urllib2.Request('http://www.oed.com/', None, header)
#f = opener.open(request)
#data = f.read()
#f.close()
#print 'database first access was successful'

resultPath = os.path.join(path, 'OED_table.csv')
htmlPath = os.path.join(path, 'OED.html')
request = urllib2.Request(
    'http://www.oed.com/search?browseType=sortAlpha&case-insensitive=true&dateFilter='
    + str(year_search)
    + '&nearDistance=1&ordered=false&page=1&pageSize=100&scope=ENTRY&sort=entry&subjectClass='
    + str(subject_search)
    + '&type=dictionarysearch', None, header)
page = opener.open(request)

with open(resultPath, 'wb') as outputw, open(htmlPath, 'w') as outputh:
    urlpage = page.read()
    outputh.write(urlpage)

    new_words = re.findall(
        r'<span class=\"hwSect\"><span class=\"hw\">(.*?)</span>', urlpage)
    print new_words
    csv_writer = csv.writer(outputw)
    for word in new_words:
        csv_writer.writerow([year_search, word])

你真的不应该用正则表达式解析html。也就是说,下面是如何修改代码以生成包含所有找到单词的csv文件

注意:由于未知原因,结果字列表的长度在每次执行中都有所不同

import csv
import os
import re
import requests
import urllib2

year_search = 1550
subject_search = ['Law']

path = '/Applications/Python 3.5/Economic'
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)

user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
header = {'User-Agent':user_agent}

# commented out because not used
#request = urllib2.Request('http://www.oed.com/', None, header)
#f = opener.open(request)
#data = f.read()
#f.close()
#print 'database first access was successful'

resultPath = os.path.join(path, 'OED_table.csv')
htmlPath = os.path.join(path, 'OED.html')
request = urllib2.Request(
    'http://www.oed.com/search?browseType=sortAlpha&case-insensitive=true&dateFilter='
    + str(year_search)
    + '&nearDistance=1&ordered=false&page=1&pageSize=100&scope=ENTRY&sort=entry&subjectClass='
    + str(subject_search)
    + '&type=dictionarysearch', None, header)
page = opener.open(request)

with open(resultPath, 'wb') as outputw, open(htmlPath, 'w') as outputh:
    urlpage = page.read()
    outputh.write(urlpage)

    new_words = re.findall(
        r'<span class=\"hwSect\"><span class=\"hw\">(.*?)</span>', urlpage)
    print new_words
    csv_writer = csv.writer(outputw)
    for word in new_words:
        csv_writer.writerow([year_search, word])

好的,我可能在这方面花了比我应该花的更多的时间来理解字典的来源(Python字典,而不是OED)以及需要编写什么。据我所知,您的预期输出只是一列
1550 |共犯
作为一行,即a列中的一年和B列中的一个单词,对于1550中的每个单词?您想在一定范围内的所有年份都这样做吗?如果我能正确理解你的要求,我会更容易把它变成一个答案。你的很多代码都是不必要的,而且你的代码是不必要的。但是,在这种情况下它似乎是有效的,所以我现在将制定一个答案,尝试使用您的方法。您可能应该使用for the
csv
模块作为参考。@roganjosh:不,您没有疯。一、 也有一段时间我得到了多个结果,但现在只有一个,
['leggiero']
@martineau谢谢你的确认,我花了很长时间调试我做了一些愚蠢的事情。OP:我不认为没有帐户就可以做到这一点,他们似乎需要在同一个IPOk发出如此多的请求后登录,我可能在这方面花了比我应该花更多的时间来尝试理解词典的来源(Python词典,而不是OED)以及需要编写什么。据我所知,您的预期输出只是一列
1550 |共犯
作为一行,即a列中的一年和B列中的一个单词,对于1550中的每个单词?您想在一定范围内的所有年份都这样做吗?如果我能正确理解你的要求,我会更容易把它变成一个答案。你的很多代码都是不必要的,而且你的代码是不必要的。但是,在这种情况下它似乎是有效的,所以我现在将制定一个答案,尝试使用您的方法。您可能应该使用for the
csv
模块作为参考。@roganjosh:不,您没有疯。一、 也有一段时间我得到了多个结果,但现在只有一个,
['leggiero']
@martineau谢谢你的确认,我花了很长时间调试我做了一些愚蠢的事情。OP:我不认为没有帐户就可以做到这一点,他们似乎需要登录,因为来自同一IP的这么多请求“leggiero”似乎成了当今的流行语。如果在浏览器中加载url,则会出现登录屏幕。虽然我不怀疑这是你写的一个不错的方法,但我认为OP会在几个请求后遇到障碍。我认为他们根本不允许刮擦。@roganjosh:我开始回答的部分原因是有一个警告。没错,我发表评论的唯一原因是我们都得到了相同的单词,OP需要放弃这种方法,除非有一个可以访问的登录机制(我没有检查它是否是付费订阅)。我们俩最后都从登录屏幕上抽出了一个词。既然你从技术上回答了关于写信给csv的问题:)@roganjosh:谢谢。如果没有其他内容,OP可以看到如何将多行写入cvs文件,而不考虑它们的数据源。我也在想,在没有某种oed帐户和相关授权的情况下,怎么可能进行这样的查询。Kainesprain:您可以通过删除新词中单词的
并调用
csv\u writer.writerow(新词)
,将它们全部写为一行(不包括年份)。您可能需要通过使用
if new\u words:csv\u writer.writerow(new\u words)
使其有条件。如果要在年初添加年份,请使用
csv\u writer.writerow([year\u search]+new\u words)
“leggiero”似乎是当天的关键词。如果在浏览器中加载url,则会出现登录屏幕。虽然我不怀疑这是你写的一个不错的方法,但我认为OP会在几个请求后遇到障碍。我认为他们根本不允许刮擦。@roganjosh:我开始回答的部分原因是有一个警告。没错,我发表评论的唯一原因是我们都得到了相同的单词,OP需要放弃这种方法,除非有一个可以访问的登录机制(我没有检查它是否是付费订阅)。我们俩最后都从登录屏幕上抽出了一个词。既然你从技术上回答了关于写信给csv的问题:)@roganjosh:谢谢。如果没有其他内容,OP可以看到如何将多行写入cvs文件,而不考虑它们的数据源。我也在想,在没有某种oed帐户和相关授权的情况下,怎么可能进行这样的查询。Kainesprain:您可以通过删除新词中单词的
并调用
csv\u writer.writerow(新词)
,将它们全部写为一行(不包括年份)。您可能需要通过使用
if new\u words:csv\u writer.writerow(new\u words)
使其有条件。如果要在be上添加年份