2017-02-15 6 views
0

Я практикую свой веб выскабливание навыки на следующем веб-сайте: «http://web.californiacraftbeer.com/Brewery-Member»Python BeautifulSoup учета отсутствующих данных на веб-сайте при записи в формате CSV

код у меня до сих пор находится ниже. Я могу захватить поля, которые я хочу, и написать информацию в 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», я мог бы написать вложенный цикл for, который выполняет итерацию через каждое из этих Divs, а затем захватывает информацию, которую я хочу в Div ,