2016-12-12 3 views
0

У меня такое чувство, что я делаю глупую ошибку. Я пытаюсь очистить некоторые данные с веб-сайта, и я могу анализировать данные, но он не пишет в csv. Я полный новичок в python, и я почесываю голову над этим.Не писать в CSV после разбора с Python/BeautifulSoup

Вот мой код до сих пор:

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]) 

ответ

0

вам нужно возвращать значения

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]) 
+0

Спасибо! Я получаю контент в csv сейчас, но формат неправильный, все записи все в одном значении. –

+0

попытайтесь отладить это, напечатав каждое значение внутри цикла ... и посмотрите, какие значения идут, попробуйте распечатать список и посмотреть, добавляется ли оно или нет. Вы почти там. –

+0

спасибо, что попробовали. Я ценю вашу помощь :) –

0

Значения cname, caddress, ccontact были установлены в контексте функции parse_content, следовательно, не доступны в for петли для Csv писателя.

Вам нужно будет либо вернуть эти значения, либо перенести csv-запись в метод parse_content.

+0

Aha! Я вижу :) Могу ли я назначить переменную следующим образом: 'ccc = (parse_content (response))', а затем использовать ее в записи csv? –

+0

Да, вы можете в зависимости от того, что вы вернетесь из 'parse_content'. – AKS

+0

Я вижу. Я пробовал это, но это не сработало: 'для страницы в диапазоне (1, total_pages): \t response = request.get (base_url + '/' + str (page)) \t if response.status_code! = 200: \t \t перерыв \t parse_content (ответ) \t ссс = (parse_content (ответ)) \t \t с открытым ('index.csv', 'а'), как csv_file: \t \t писательницы = csv.writer (csv_file) \t \t writer.writerow ([ccc]) ' –

Смежные вопросы