2014-02-16 5 views
1

http://www.immihelp.com/h1b-sponsoring-companies-database/display-2-2010.html의 일부 열을 CSV 시트에서 추출하려고합니다.BeautifulSoup의 for 루프 관련 문제

from bs4 import BeautifulSoup 
import urllib2 
import csv 

f = csv.writer(open("H1B_apps.csv", "w")) 
f.writerow(["Name", "Jobs", "Positions", "Wage", "City", "State", "Zip"]) # Write column headers as the first line 

for x in range (2,5): 

    soup = BeautifulSoup(urllib2.urlopen('http://www.immihelp.com/h1b-sponsoring-companies-database/display-'+str(x)+'-2010.html').read()) 

    table = soup.find('table', cellspacing = '1') 

    rows = table.findAll('tr') 



    for tr in rows: 
     cols = tr.findAll('nobr') 
     for data in cols: 
      name = cols[0].findAll(text=True) 
      jobs = cols[1].findAll(text=True) 
      position = cols[2].findAll(text=True) 
      wage = cols[3].findAll(text=True) 
      city = cols[4].findAll(text=True) 
      state = cols[5].findAll(text=True) 
      zip = cols[6].findAll(text=True) 

      print(name,jobs,position,wage,city,state,zip) 
      f.writerow([name,jobs,position,wage,city,state,zip]) 

코드가 일반적으로 잘 작동하는 것 같습니다. 그러나 나는 다음과 같은 문제가 있습니다

  1. 출력이 자체
  2. 출력 텍스트 [ 'U 텍스트를'] 오는 (? 내 루프,하지만 그것을 알아낼 수 없습니다에 뭔가 문제)를 7 번 반복 유지 - 나는 단지 텍스트 비트를 원한다. 어떤 도움을 주시면 감사하겠습니다

    ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER SUPPORT SPECIALISTS'], [u'43139.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER SUPPORT SPECIALISTS'], [u'43139.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER SUPPORT SPECIALISTS'], [u'43139.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER SUPPORT SPECIALISTS'], [u'43139.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'55994.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'55994.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'55994.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'55994.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'55994.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'55994.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'55994.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'67995.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'67995.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'67995.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'67995.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873']) ([u'22ND CENTURY TECHNOLOGIES, INC'], [u'1'], [u'COMPUTER PROGRAMMERS'], [u'67995.0/Year'], [u'SOMERSET'], [u'NJ'], [u'08873'])

    : 여기

출력의 샘플입니다. 감사합니다.

+0

'findAll'은 단지 하나 이상인 경우 * all *을 찾을 수 있도록 설계되었습니다. 그래서'findAll'의 출력은 발견 된 모든것의 목록입니다. 단 하나의 항목이 아닙니다. 첫 번째 파일을 찾으려면 목록의 첫 번째 요소 ('findAll (...) [0]')에 액세스하거나 첫 번째 위치에서'find'를 사용하십시오. – poke

+0

감사합니다. (findAll (...) [0]) 시도 할 때 cols [5]에 대한 IndexError가 있습니다. 찾기를 시도했지만 효과적 이었지만 여전히 7 명의 데이터 엔터티를 얻습니다. – user3316270

답변

1

[0], [1], [2]로 직접 액세스 할 때 data in cols을 반복 할 필요가 없습니다. for data in cols: 행을 삭제하면 7 번 모두 중단됩니다.

는 또한, findAll는 항상 목록을 반환, 그래서

그러나, 일부 라인이 빈 필드가 그 own.a에 각 요소를 얻을 수 name = cols[0].findAll(text=True)[0]을 할 것입니다. 시도하면 빈 필드를 얻을 findAll, [''] 아니라 빈 목록 [], 반환하므로 [0] 함께 액세스 할 수 없습니다.

비어, 그리고 결과를 반환하는 것은 당신이 시간의 전체 무리를하고있는 일반적인 것, 할 수있는 간단한 방법 인 경우 검사 필드를 받고 있기 때문에 그것은 간단한 도우미 기능입니다 :

def getcol(cols, index, default=None): 
    try: 
     return cols[index].findAll(text=True)[0] 
    except IndexError: 
     return default 

그런 다음 for 루프에서 name = getcol(cols, 0)과 함께 사용할 수 있습니다.

또한 일부 줄이 비어 있기 때문에이를 고려해야합니다. 로, 그들은 바보 비트가 '이 웹 페이지의 내용을 볼 수없는'생각하는 것

immihelp.com reserves all of our rights, including but not limited to any and all copyrights, trademarks, patents, trade secrets, and any other proprietary right that we may have in our web site, its content, and the goods and services that may be provided. The use of our rights and property requires our prior written consent. We are not providing you with any implied or express licenses or rights by making services available to you and you will have no rights to make any commercial uses of our web site or service without our prior written consent.

Contents of this webpage can't be seen as they are not meant to be viewed or copied.

Any violator will be prosecuted to the full extent of law and may face civil and criminal charges and huge monetary fines. You are warned! Beware!

: 그냥 알다시피

, 그 immihelp 페이지의 소스는이 저작권을 가지고 , 꽤 열심히, 그들은 할 수 없다면 당신의 웹 브라우저는 그것을 보여줄 수 없었다. 그러나 그들은 조금 더 어렵게하기 위해 길을 나서지 않았으며 동의없이 데이터를 사용하는 것은 아마 고소 할 수있는 것입니다.

불법인지 여부는 평소와 같이 변호사 비용을 지불해야합니다.

+0

감사합니다, Daniel. cols : loop에서 데이터를 제거하고 tr in rows : 루프에 넣으면 'IndexError : list index of range'가 표시됩니다. 나는 그 루프에서 벗어나려고 노력했다. 그저 그 자체로 그리고 나서 나는 마지막 데이터 라인을 얻는다.감사합니다. – user3316270

+0

안녕하세요 - 저는 이러한 종류의 문제를 해결하는 방법에 대해 좀 더 자세히 설명했습니다. 해당 페이지의 저작권 세부 사항으로 인해 전체 작업 스크립트를 게시하지 않겠습니다. 이 단계에서는 일반적으로 페이지에서 데이터를 가져 오는 방법에 대한 학문적 질문이 여전히 (틀림없이) 있습니다. 실제 해결책을 게시하는 것은 통고에 위배됩니다. –

+0

많은 감사합니다! 완벽하게 작동합니다. – user3316270