【问题标题】:Not writing to CSV after parsing with Python/BeautifulSoup使用 Python/BeautifulSoup 解析后不写入 CSV
【发布时间】:2017-04-27 07:11:20
【问题描述】:

我有一种感觉,我犯了一个愚蠢的错误。我正在尝试从网站上抓取一些数据,我可以解析数据,但它不会写入 csv。我是 python 的初学者,对此我摸不着头脑。

到目前为止,这是我的代码:

import requests
import csv
from  bs4 import BeautifulSoup

base_url = "http://www.example.com/"

total_pages = 100

def parse_content(r):
    soup = BeautifulSoup(r.content,'lxml')
    g_data = soup.find_all('ul', {"class": "searchResults"})

    for item in g_data:
        for li in item.findAll('li'):
            for resultnameh2 in li.findAll('h2'):
                for resultname in resultnameh2.findAll('a'):
                    cname = resultname.text
                    
        for resultAddress in li.findAll('p', {"class": "resultAddress"}):
            caddress = resultAddress.text.replace('Get directions','').strip()  
            
        for resultContact in li.findAll('ul', {"class": "resultContact"}):
            for resultContact in li.findAll('a', {"class": "resultMainNumber"}):
                ccontact = resultContact.text

for page in range(1, total_pages):
    response = requests.get(base_url + '/' + str(page))
    if response.status_code != 200:
        break

    parse_content(response)
    csvdata = parse_content(response)
    
    with open('index.csv', 'a') as csv_file:  
        writer = csv.writer(csv_file)
        writer.writerow([csvdata])

【问题讨论】:

    标签: python csv web-scraping beautifulsoup


    【解决方案1】:

    cnamecaddressccontact 的值已在函数 parse_content 的上下文中设置,因此在 csv 写入器的 for 循环中不可用。

    您要么需要返回这些值,要么需要在 parse_content 方法中移动 csv 写入器。

    【讨论】:

    • 啊哈!我明白了:) 我可以分配一个像这样的变量:ccc = (parse_content(response)) 然后在 csv 编写器中使用它吗?
    • 是的,你可以根据你从parse_content返回的内容。
    • 我明白了。我试过了,但没有用:for page in range(1, total_pages): response = requests.get(base_url + '/' + str(page)) if response.status_code != 200: break parse_content(response) ccc = (parse_content(response)) with open('index.csv', 'a') as csv_file: writer = csv.writer(csv_file) writer.writerow([ccc])
    • 您没有从parse_content 函数返回任何内容。而且,不需要调用两次。
    • 我不确定我是否理解。我尝试在 def parse_content(r): 内移动 csv 编写器,但没有运气。你能给我一些示例代码吗?我真的从今天开始学习 python :)
    【解决方案2】:

    你需要返回值

    import requests
    import csv
    from  bs4 import BeautifulSoup
    
    base_url = "http://www.example.com/"
    
    total_pages = 100
    
    def parse_content(r): # you are not returning anything from this function, I will change this function so it will return required values.
        cname=[]
        caddress=[]
        ccontact=[]
        soup = BeautifulSoup(r.content,'lxml')
        g_data = soup.find_all('ul', {"class": "searchResults"})
    
        for item in g_data:
            for li in item.findAll('li'):
                for resultnameh2 in li.findAll('h2'):
                    for resultname in resultnameh2.findAll('a'):
                        cname.append(resultname.text) # As it is list you need to append all these values
    
            for resultAddress in li.findAll('p', {"class": "resultAddress"}):
                caddress.append(resultAddress.text.replace('Get directions','').strip())  
    
            for resultContact in li.findAll('ul', {"class": "resultContact"}):
                for resultContact in li.findAll('a', {"class": "resultMainNumber"}):
                    ccontact.append(resultContact.text)
    
        return cname,caddress,ccontact
    
    for page in range(1, total_pages):
        response = requests.get(base_url + '/' + str(page))
        if response.status_code != 200:
            break
    
        parse_content(response)
        cname,caddress,ccontact = parse_content(response)
        print(cname)
        print(caddress)
        print(ccontact)
        #print whatever you like from above lists 
        with open('index.csv', 'a') as csv_file:  
            writer = csv.writer(csv_file)
            writer.writerow([csvdata])
    

    【讨论】:

    • 谢谢!我现在正在将内容放入 csv,但格式错误,所有记录都在一个值中。
    • 尝试通过在 for 循环中打印每个值来调试它。看看会出现什么值,尝试打印列表并查看是否被附加。你快到了。
    • 我一直在尝试,但没有运气。每个项目都有三个值,我希望 csv 中的每一行都有三个值:cname, caddress, ccontact 我似乎无法正确处理。
    • @Bruno 您要提取哪个网址?
    • 已解决 :) 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多