我正在构建一个简单的程序来从URL列表中获取所有页面标题,然后将它们写入CSV文件。我已经完成并理解了大部分内容,除了一件事:无论我如何更改代码,我都会一遍又一遍地获得密钥错误。请看一下,告诉我这些代码有什么问题:
import requests
import json
import urllib2
import csv
from BeautifulSoup import BeautifulSoup
def getsnapshot(domain):
base = 'http://archive.org/wayback/available?url='
r = requests.get(base+domain, verify=False)
j = json.loads(r.text)
if j['archived_snapshots'] == {}:
pass
else:
archive_url = j['archived_snapshots']['closest']['url']
return archive_url
def gettitle(url):
soup = BeautifulSoup(urllib2.urlopen(getsnapshot(url)))
return soup.title.string
def writecsv(domain):
c = csv.writer(open("output.csv", "wb"))
snapshoturl = getsnapshot(domain)
title = gettitle(snapshoturl)
c.writerow([domain,title])
with open('input.txt', 'r') as f:
for line in f.read().splitlines():
writecsv(line)
我的输入只是一个URL列表,特别是域名。我正在查看域名历史记录,看看过去是否有垃圾邮件。
这里是JSON
{
"archived_snapshots": {
"closest": {
"available": true,
"url": "http://web.archive.org/web/20050408030822/http://www.001music.net:80/",
"timestamp": "20050408030822",
"status": "200"
}
}
}
答案 0 :(得分:1)
我认为您的问题是,您认为如果rsync -azu -e 'ssh -p 12345' /path/to/local/folder user@remoteip:/path/to/remote/folder
非空,则会始终包含键映射“最接近”的键。到包含键' url'的字典。验证这个假设你应该好好去:
j['archive_snapshots']
如果其中任何一项假设为if 'archived_snapshots' in j and j['archived_snapshots']:
return j['archived_snapshots'].get('closest',{}).get('url')
,则会返回None
,因此请相应地调整False
的来电者,以便仅在网址getsnapshot()
时进行调整(或者,异常并在is not None
块中包装调用)
此外,您当前的代码将覆盖您添加的每个新行的文件。要么以附加模式(try/except
)打开,要么更有效率,将for循环包含在另一个open("output.csv", "a")
调用中,并将with
对象直接传递给csv.writer()
答案 1 :(得分:0)
您是否尝试过使用r.json()
?它内置于requests
lib
KeyError通常与您对对象或字典有关,但您还没有向我们展示json。
此外,requests
可以替代urllib2
。我尝试仅使用requests