2017-09-08 5 views
-1

단일 셀에 여러 항목이있는 테이블을 다운로드하려고합니다. 나는 세 가지 문제를 얻을 :웹 스크래핑의 셀에 여러 줄이 있음

트랙 목록의 열이 올바르게 (다음과 같은 행의 헤더에 기록 된대로 (다른 데이터 유형과 같은 행을 해주 insted한다)] 생성되지 않습니다
  1. ,
  2. 노래를 마지막으로 내 서식을 여러 줄을 제거하는 열 (트랙리스트)는 하나 개의 셀에 포함되지 않으며, 내가 방법을 찾을 수 없습니다;
  3. 다운로드는 1990 년에 중지 오류

    "UnicodeEncodeError: 'charmap' codec can't encode character '\x91' in position 2886: character maps to < undefined >"

    에 대한 좀 답변을 찾을 하지만 나 아직도 문제를 어떻게 해결해야하는지 이해할 수 없습니다. 나는 어제 같은 문제가 있었고, 온라인으로 읽음으로써 시스템에 의해 인식되지 않는 이상한 성격이있는 것으로 보인다. 문제를 확실히 해결할 수있는 방법이 없습니까? (엑셀 사용을 위해 CSV를 내보낼 것입니다).

    1. 첫번째 행이 정확 의해 생성된다 : I 프린트 함수 출력에서 ​​볼

      import codecs 
      import urllib 
      import urllib.request 
      from bs4 import BeautifulSoup 
      from urllib.request import urlopen as uReq 
      import unicodecsv as csv 
      years = list(range(1965,2016)) 
      
      for year in years: 
          my_urls = ('http://www.hitparadeitalia.it/hp_yenda/lpe' + str(year) + '.htm',) 
          my_url = my_urls[0] 
          for my_url in my_urls: 
           uClient = uReq(my_url) 
           html_input = uClient.read() 
           uClient.close() 
           page_soup = BeautifulSoup(html_input, "html.parser") 
           [s.extract() for s in page_soup('script')] 
           filename = "ALBUM" + str(year) + ".csv" 
           f = open(filename, "w") 
           headers = "NN, album, interprete, etichetta, mass, tracklist" + "/n" 
           f.write(headers) 
           containers = page_soup.findAll("table", {"class":"piccolo"}) 
           containerr = containers[0].findAll("tr") 
           container = containerr[0] 
           for container in containerr: 
            items = container.findAll("td") 
            NN = items[0].text 
            album = items[1].text 
            interprete = items[2].text 
            etichetta = items[3].text 
            mass = items[4].text 
            tracklist = items[5].text.strip() 
      
            print("NN: " + NN) 
            print("album: " + album) 
            print("interprete: " + interprete) 
            print("etichetta: " + etichetta) 
            print("mass: " + mass) 
            print("tracklist: " + tracklist) 
      
            f.write(NN + "," + album + "," + interprete + "," + etichetta + "," + mass + "," + tracklist + "\n") 
           f.close() 
      

      (I는 @Anurag에서 제안 시도 후)

    는 코드 각 열 제목에 데이터 첨부;
  4. 두 번째 행에서 다음 트랙의 모든 텍스트를 throw하고 동일한, 잘못된 반복을 수행하여 다음 행에서 다시 시작하는 것보다 tracklist 열까지 작동합니다.

가장 좋은 방법은 코드를 실행하고 출력을 봅니다 (아래로 스크롤하면 문제가 반복되어야 함).

답변

0
...  
for container in containerr: 
    items = container("td") 
    NN = items[0].text.encode('utf-8','ignore') 
    album = items[1].text.encode('utf-8','ignore') 
    interprete = items[2].text.encode('utf-8','ignore') 
    etichetta = items[3].text.encode('utf-8','ignore') 
    mass = items[4].text.encode('utf-8','ignore') 
    tracklist = items[5].text.encode('utf-8','ignore') 

    print("NN: " + NN) 
    print("album: " + album) 
    print("interprete: " + interprete) 
    print("etichetta: " + etichetta) 
    print("mass: " + mass) 
    print("tracklist: " + tracklist) 
... 

당신은 utf-8 또는 ascii로 출력을 encode 수 있습니다.

+0

utf-8을 얻으려면 csv에게 알기 쉽게 뭔가가 필요하기 때문에 작동하지 않습니다. 다른 게시물에 제안 된 것처럼 f = open (파일 이름, "w", 'utf-8')으로 시도했지만 작동하지 않습니다. –

+0

'python2. + '를 사용한다면'ascii'에 우연히 인코딩 스타일 –

+0

파이썬 3을 사용하고 있습니다. –