【问题标题】:Python BeautifulSoup accounting for missing data on website when writing to csvPython BeautifulSoup 在写入 csv 时会考虑网站上的缺失数据
【发布时间】:2017-02-15 07:53:30
【问题描述】:

我正在以下网站练习我的网页抓取技巧:“http://web.californiacraftbeer.com/Brewery-Member”

我到目前为止的代码如下。我能够获取我想要的字段并将信息写入 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()

非常感谢任何帮助!

【问题讨论】:

  • 如果某些公司的某些数据不存在,则将该数据存储为空字符串(' '),以便在写入 csv 时跳过该列。

标签: python csv beautifulsoup


【解决方案1】:

您需要使用zip 同时遍历所有这些数组:

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

【讨论】:

  • 谢谢,这解决了我遇到的拆包问题!
【解决方案2】:

感谢您的帮助。

我意识到,由于每个公司的公司详细信息都包含在 Div 类“ListingResults_All_CONTAINER ListingResults_Level3_CONTAINER”中,我可以编写一个嵌套的 for 循环来遍历每个 Div,然后在 Div 中获取我想要的信息。

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 2015-09-26
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2019-02-05
    相关资源
    最近更新 更多