2017-02-15 5 views
0

をCSVファイルへの書き込み時に、ウェブサイト上のデータの欠落を占め:私はこれまで持っている「http://web.californiacraftbeer.com/Brewery-MemberPythonのBeautifulSoupは、私は、以下のウェブサイト上でスキルをこする私のウェブを練習しています

コードは以下の通りです。私は私がしたいフィールドを取得し、CSVに情報を書き込むことができるんだけど、各行の情報は、実際の会社の詳細と一致していません。たとえば、A社にはD社の連絡先名とE社の電話番号が同じ行に表示されます。

いくつかのデータは、特定の企業のために存在していないので、CSVに会社ごとに分離する必要がある行を記述するとき、どのように私はこのことを考慮することができますか? CSVへの書き込み時に、私は正しい企業のための正しい情報をつかんだということを確認するための最良の方法は何ですか?

""" 
Grabs brewery name, contact person, phone number, website address, and email address 
for each brewery listed. 
"""  

import requests, csv 
from bs4 import BeautifulSoup  

url = "http://web.californiacraftbeer.com/Brewery-Member" 
res = requests.get(url) 
soup = BeautifulSoup(res.content, "lxml") 
company_name = soup.find_all(itemprop="name") 
contact_name = soup.find_all("div", {"class": "ListingResults_Level3_MAINCONTACT"}) 
phone_number = soup.find_all("div", {"class": "ListingResults_Level3_PHONE1"}) 
website = soup.find_all("span", {"class": "ListingResults_Level3_VISITSITE"})  

def scraper(): 
    """Grabs information and writes to CSV""" 
    print("Running...") 
    results = [] 
    count = 0 
    for company, name, number, site in zip(company_name, contact_name, phone_number, website): 
     print("Grabbing {0} ({1})...".format(company.text, count)) 
     count += 1 
     newrow = [] 
     try: 
      newrow.append(company.text) 
      newrow.append(name.text) 
      newrow.append(number.text) 
      newrow.append(site.find('a')['href']) 
     except Exception as e: 
      error_msg = "Error on {0}-{1}".format(number.text,e) 
      newrow.append(error_msg) 
     results.append(newrow) 
    print("Done") 
    outFile = open("brewery.csv","w") 
    out = csv.writer(outFile, delimiter=',',quoting=csv.QUOTE_ALL, lineterminator='\n') 
    out.writerows(results) 
    outFile.close() 

def main(): 
    """Runs web scraper""" 
    scraper()  

if __name__ == '__main__': 
    main() 

ご協力いただきありがとうございます。

+0

特定の企業はその後、ヌル文字列としてそのデータを格納するために、CSVに書き込んでいる間、それはその列をスキップするように、いくつかのデータは、(」「)が存在しない場合。 –

答えて

0

あなたは同時にすべてのそれらの配列を反復処理するzipを使用する必要があります。助けを

for company, name, number, site in zip(company_name, contact_name, phone_number, website): 
+0

おかげで、これは私が持っていたアンパック問題の世話をします! –

0

感謝を。

私は、各社の会社の詳細がDivクラス "ListingResults_All_CONTAINER ListingResults_Level3_CONTAINER"に含まれているので、これらのDivのそれぞれを繰り返し処理し、Divの中で必要な情報を取得するネストされたforループを書くことができました。

関連する問題