2013-11-15 4 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.

관련 문제