2016-05-07 11 views
0

あなたは私の直面している問題について新しい質問をしていますが、皆さんは私の最後の質問ですごく助けになりました。私はBeautifulSoupをインポートし、このサイトの医科大学のデータベースからデータをエクスポートしようとしています:https://services.aamc.org/msar/home。私はウェブサイトを開いて解析するための "for"ループを作成し、都市と州の学校を含む特定のスパンからデータを印刷します。コードを実行した後、私は自分のコードが動作していたことを知ってうれしく思いました!!そして、それは3番目の学校の後にエラーを返すことを驚かせました。問題の可能性のために周りのスヌーピング時に、私が代わりにhttps://services.aamc.org/msar/schoolDetails /(コード)の私は使用からURLをデータを引っ張った学校のいくつかの「https://services.aamc.org/msar/プログラム詳細/(コード)/約」、/について(ことを見ました私はコード内のURLとして設定していました)、したがって、私のプログラムは、存在しないWebページからスパンデータを取得しようとしています!UrllibとBeautifulSoupフレキシブルなurlopen()オプション

"このURLまたはそのURLを特定する"という私の "url ="にURLを定義する方法を知っている人はいませんか、またはURLのその部分をスキップしてコードを単純に一致させる/ URLの一部については?最も重要なことは、このコードをデータベースに表示されている順序と同じ順序で返すことです。このデータをすべてCSV形式の列にインポートして並べ替えることになります。だから、それは無作為な順序であることはできません。

ありがとう、本当に助けていただきありがとうございます。各学校の正しいURLについて、その情報を仮定し

マット(下記のコードの申し訳ありません一部がコードウィンドウに表示されません!)


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

'[" searchResults "] [" rows "]'には正しいURLに関する情報が含まれていますか? – har07

+0

はい、 "search_url"を見ると、メインページ "https://services.aamc.org/msar/home"のすべての情報のコードが表示されます。私は各学校(https://services.aamc.org/msar/schoolDetails/%d/about "%code)のページに行き、都市を掻き集めようとしています。問題は、個々の学校のサイトが"https://services.aamc.org/msar/schoolDetails/%d/about"%code "、時には" https://services.aamc.org/msar/programDetails/%d/about "%code "私はBeautifulSoupのコマンドを知っていないので、" schoolDetails "または" programDetails "のいずれかのURLに文字列を入れることができます。 –

+0

" if/else文が機能するかもしれない "と思っています。 –

答えて

0

は事前に利用できない、あなたはtry ... except...を使用することができます最初のURLフォーマットを試してみて、最初に「ページが見つかりません」と返された場合のみ2番目の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;"}) 
+0

これは機能しますが、リンク内の「programDetails」を持つすべてのサイトからデータを取得できません。私はこれが、これらのウェブサイトでポップアップするエラーが原因であると考えています。これはまだtry/except関数を実行できないため、サイトが読み込み不可能なためです。エラーコードは "TypeError: 'NoneType'オブジェクトは反復可能ではありません"。これらの値はnoneのままにします。 –

関連する問題