Wayback Machine scraper上的JSON KeyError

时间:2015-09-04 03:00:35

标签: python json beautifulsoup

我正在构建一个简单的程序来从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"
    }
  }
}

2 个答案:

答案 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