2017-02-16 9 views
1

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

код, который я до сих пор находится ниже. Похоже, что я получаю правильный подсчет компании, но я получаю дубликаты строк в файле CSV, что, я думаю, происходит всякий раз, когда компания пропускает информацию. В нескольких частях моего кода я пытался обнаружить и заменить недостающую информацию текстом «N/A», но он не работает. Я предполагаю, что эта проблема может быть связана с функцией Zip(), но я не уверен, как ее исправить.

Любая помощь очень ценится!

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

import requests, csv 
from bs4 import BeautifulSoup 

url = "http://web.californiacraftbeer.com/Brewery-Member" 
res = requests.get(url) 
soup = BeautifulSoup(res.content, "lxml") 
each_company = soup.find_all("div", {"class": "ListingResults_All_CONTAINER ListingResults_Level3_CONTAINER"}) 
error_msg = "N/A" 

def scraper(): 
    """Grabs information and writes to CSV""" 
    print("Running...") 
    results = [] 
    count = 0 

    for info in each_company: 
     try: 
      company_name = info.find_all("span", itemprop="name") 
     except Exception as e: 
      company_name = "N/A" 
     try: 
      contact_name = info.find_all("div", {"class": "ListingResults_Level3_MAINCONTACT"}) 
     except Exception as e: 
      contact_name = "N/A" 
     try: 
      phone_number = info.find_all("div", {"class": "ListingResults_Level3_PHONE1"}) 
     except Exception as e: 
      phone_number = "N/A" 
     try: 
      website = info.find_all("span", {"class": "ListingResults_Level3_VISITSITE"}) 
     except Exception as e: 
      website = "N/A" 

     for company, contact, phone, site in zip(company_name, contact_name, phone_number, website): 
      count += 1 
      print("Grabbing {0} ({1})...".format(company.text, count)) 
      newrow = [] 
      try: 
       newrow.append(company.text) 
      except Exception as e: 
       newrow.append(error_msg) 
      try: 
       newrow.append(contact.text) 
      except Exception as e: 
       newrow.append(error_msg) 
      try: 
       newrow.append(phone.text) 
      except Exception as e: 
       newrow.append(error_msg) 
      try: 
       newrow.append(site.find('a')['href']) 
      except Exception as e: 
       newrow.append(error_msg) 
      try: 
       newrow.append("[email protected]" + company.text.replace(" ", "").lower() + ".com") 
      except Exception as 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

Из bs4 docs

"Если find_all() не может найти что-либо, он возвращает пустой список. Если находка() не может найти что-нибудь, он возвращает None"

Так, например, когда company_name = info.find_all("span", itemprop="name") работает и ничего не соответствует, он не генерирует исключения, а "NA" никогда не будет установлен.

В этом случае вам нужно проверить, является ли company_name пустой список:

if not company_name: 
    company_name = "N/A" 
+0

Awesome, что исправили проблему, спасибо! –