Urllib和BeautifulSoup灵活的urlopen()选项

时间:2016-05-07 20:26:37

标签: python beautifulsoup urlopen

对于我的上一个问题,你们都非常有帮助,所以我会提出一个关于我一直面临的问题的新问题。我导入了BeautifulSoup,并尝试从该网站的医学院数据库导出数据:https://services.aamc.org/msar/home。我创建了一个" for"循环打开并解析网站,然后打印包含学校所在城市和州的特定范围内的数据。在执行代码之后,我很高兴地发现我的代码正在运行!!并且在第三次学校之后看到它返回错误而感到沮丧。在窥探一个可能的问题时,我看到我正在提取数据的一些学校使用网址" https://services.aamc.org/msar/ 计划详细信息/(代码)/关于" ,而不是https://services.aamc.org/msar/ schoolDetails /(code)/ about(我在代码中设置为我的url),因此我的程序试图从一个网页中提取跨度数据不存在!

有没有人知道在我的" url ="中定义网址的方法?那说"识别这个网址或者网址",或者可能是跳过网址部分的选项,只是匹配代码和/关于部分网址?最重要的是代码以数据库中出现的SAME顺序返回城市信息,因为我将所有这些数据导入CSV格式的列并排列。所以它不能随机排列。

谢谢,我非常感谢您的帮助。

马特(对不起,下面的代码部分没有出现在代码窗口中!)

import requests
from urllib2 import urlopen
from bs4 import BeautifulSoup

url = "https://services.aamc.org/msar/home#null"
search_url = "https://services.aamc.org/msar/search/resultData"

with requests.Session() as session:
    session.get(url)  # visit main page

    # search
    data = {
        "start": "0",
        "limit": "500",
        "sort": "",
        "dir": "",
        "newSearch": "true",
        "msarYear": ""
    }
    response = session.post(search_url, data=data)
    import csv
    # extract search results
    results = response.json()["searchResults"]["rows"]

    codes = []

    for result in results:
        codes.append(int(result["key"]))


for code in codes:
    url = "https://services.aamc.org/msar/schoolDetails/%d/about" % code
    soup = BeautifulSoup(urlopen(url))

    city = soup.find("span", {"style": "font-size: 16px; font-weight: bold;"})

    for span in city:
        print(span)

1 个答案:

答案 0 :(得分:0)

假设事先没有关于每所学校的正确URL的信息,您可以使用try ... except...构造来尝试第一种URL格式,然后只有在找不到第一个返回的页面时才尝试第二种URL格式'(在url2中放置不太可能的网址,如果有的话,以最大限度地减少错失的情况):

from urllib2 import urlopen, HTTPError
.....

url1 = "https://services.aamc.org/msar/schoolDetails/%d/about"
url2 = "https://services.aamc.org/msar/programDetails/%d/about"
for code in codes:
    soup = None

    try:
        soup = BeautifulSoup(urlopen(url1 % code))
    except HTTPError as e:
        if e.getcode() == 404: # page not found
            print("first URL not found, trying the second URL...")
            soup = BeautifulSoup(urlopen(url2 % code))

    city = soup.find("span", {"style": "font-size: 16px; font-weight: bold;"})