对于我的上一个问题,你们都非常有帮助,所以我会提出一个关于我一直面临的问题的新问题。我导入了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)
答案 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;"})