使用Python/beautifulsou解析后不写入CSV

2024-10-03 06:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我觉得我犯了个愚蠢的错误。我试图从一个网站上截取一些数据,我可以解析数据,但它不能写入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])

Tags: csv数据textinimportforparseresponse
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])

cnamecaddressccontact的值已在函数parse_content的上下文中设置,因此在csv writer的for循环中不可用。你知道吗

您需要返回这些值或在parse_content方法中移动csv writer。你知道吗

相关问题 更多 >