2016-12-12 4 views
0

私は愚かな間違いをしています。私はいくつかのデータをウェブサイトから取り除こうとしていますが、データを解析することはできますが、CSVには書き込まれません。私はPythonの完全な初心者です、私はこれ以上頭を傷つけています。ここでPython/BeautifulSoupで解析した後にCSVに書き込まない

は、これまでの私のコードです:

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にコンテンツを取得していますが、フォーマットは間違っています。すべてのレコードがすべて1つの値になっています。 –

+0

ループ内の各値を印刷して、どの値が来るのかを確認し、リストを印刷して、追加されているかどうかを確認してください。あなたはほとんどそこにいます。 –

+0

ありがとうございました。私はあなたの助けに感謝します:) –

0

cnamecaddressの値は、ccontactが故に機能parse_contentのコンテキストで設定されているCSVライター用forループでは使用できません。

parse_contentメソッドでこれらの値を返すか、csvライターを移動する必要があります。

+0

アハを返却する必要があります!私は参照してください:)このような変数を割り当てることができます: 'ccc =(parse_content(response))'とそれをcsvライターで使用しますか? –

+0

はい、あなたは 'parse_content'から何を返すかによって決まります。 – AKS

+0

私は参照してください。私はこれを試みましたが、うまくいかなかった: 'page in range(1、total_pages): \t response = requests.get(base_url + '/' + str(page)) \t response.status_code!= 200の場合: \t \t csv_fileとしてオープン( 'index.csv'、 'A')とのブレーク \t parse_content(レスポンス) \t CCC =(parse_content(レスポンス)) \t \t: \t \tライター= csv.writer( csv_file) \t \t writer.writerow([ccc]) ' –

関連する問題