2013-11-15 2 views
0

У меня есть следующий код для очистки данных. Данные соскабливаются. Но выход немного испорчен.Оставьте пространство, если значение отсутствует BS4 python

from bs4 import BeautifulSoup 
import urllib2 
import re 
import csv 
with open('ccccc.csv', 'wb') as f: 
    writer = csv.writer(f, quoting=csv.QUOTE_ALL) 
    for i in xrange(1,3): 
     try: 
      page = urllib2.urlopen("http://www.codissia.com/member/members-directory/?mode=paging&Keyword=&Type=&pg={}".format(i)) 
     except urllib2.HTTPError: 
      continue 
     else: 
      soup = BeautifulSoup(page.read(), from_encoding=page.info().getparam('charset')) 
      eachbox = soup.find_all('div', {'class':re.compile(r'members_box[12]')}) 
      for pair in zip(*[iter(eachbox)]*2): 
       writer.writerow([text.strip() for item in pair for text in item.stripped_strings]) 

В изображении, которое я добавил, вы видите, что есть несоответствие столбцов.

Это структура данных, что я выскабливание

<div class="members_box_second"> 
        <div class="members_box0"> 
         <p>1</p> 
        </div> 
        <div class="members_box1"> 
         <p class="clear"><b>Name:</b><span>Mr.Jagadhesan.S</span></p> 
         <p class="clear"><b>Designation:</b><span>Proprietor</span></p> 
         <p class="clear"><b>CODISSIA - Designation:</b><span>(Founder President, CODISSIA)</span></p> 
         <p class="clear"><b>Name of the Industry:</b><span>Govardhana Engineering Industries</span></p> 
         <p class="clear"><b>Specification:</b><span>LIFE</span></p> 
         <p class="clear"><b>Date of Admission:</b><span>19.12.1969</span></p> 
        </div> 
        <div class="members_box2"> 
         <p>Ukkadam South</p> 
         <p class="clear"><b>Phone:</b><span>2320085, 2320067</span></p> 
         <p class="clear"><b>Email:</b><span><a href="mailto:[email protected]">[email protected]</a></span></p>      
        </div> 
</div> 
<div class="members_box"> 
        <div class="members_box0"> 
         <p>2</p> 
        </div> 
        <div class="members_box1"> 
         <p class="clear"><b>Name:</b><span>Mr.Somasundaram.A</span></p> 
         <p class="clear"><b>Designation:</b><span>Proprietor</span></p> 

         <p class="clear"><b>Name of the Industry:</b><span>Everest Engineering Works</span></p> 
         <p class="clear"><b>Specification:</b><span>LIFE</span></p> 
         <p class="clear"><b>Date of Admission:</b><span>19.12.1969</span></p> 
        </div> 
        <div class="members_box2"> 
         <p>Alagar Nivas, 284 NSR Road</p> 
         <p class="clear"><b>Phone:</b><span>2435674</span></p>  
         <h4>Factory Address</h4> 
         Coimbatore - 641 027 
         <p class="clear"><b>Phone:</b><span>2435674</span></p> 
        </div> 
</div> 

Я хочу, чтобы данные, которые будут размещены в соответствующем столбце. Например, все имена должны совпадать с одним и тем же именем столбца, например, с мудрым номером телефона и электронной почтой и т. Д. Если телефон нет, он должен оставить пустое место в файле csv. Я даже не закрываю чтобы получить эту идею.

My Current Output

+0

В настоящее время, что заполнено, если пройденное значение пуст? – aIKid

+0

следующие ближайшие данные заполняют позицию, которой я не хочу. –

ответ

1

Основываясь на то, что вы хотите, я рекомендую вам извлечь все значения последовательно, а затем написать один за другим. Например, рассмотрим следующий код:

from bs4 import BeautifulSoup 
import urllib2 
import re 
import csv 

with open('ccccc.csv', 'wb') as f: 
    writer = csv.writer(f, quoting=csv.QUOTE_ALL) 
    for i in xrange(1,3): 
     try: 
     page = urllib2.urlopen("http://www.codissia.com/member/members-directory/?mode=paging&Keyword=&Type=&pg={}".format(i)) 
     except urllib2.HTTPError: 
     continue 
     else: 
     soup = BeautifulSoup(page.read(), from_encoding=page.info().getparam('charset')) 
     eachbox = soup.find_all('div', {'class':re.compile(r'members_box[12]')}) 
     for pair in zip(*[iter(eachbox)]*2): 
      # I put only the most relevant, you can put more... 
      dict = {'Name':'','Designation':'','Name of the Industry':'','Specification':'','Date of Admission':'','Phone':'', 'Email':''} 
      for item in pair: 

       #this is for the members_box1 , because all is organized by this tree     
       for p in item.find_all('p'): 
       dict[p.b.text] = item.p.span.text 

       # for the second members you need to use it equal but based in his HTML Tree, for example, of course in the second iteration : 
       dict['Address'] = item.p.text 


      # write to the CSV 
      write.writerow([dict[key] for key dict.keys()]) 

Таким образом, вы можете написать пустую строку, если элемент отсутствует, потому что вы установили в словаре пустую строку и уважать импоста порядок в CSV.

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