2017-11-22 11 views
1

영국의 공동 데이터를 폐기하고 한 번에 하나의 병원에서 원하는 형식으로 결과를 얻습니다. 결국 모든 병원을 반복하고 싶지만 처음에는 세 가지 병원을 배열하여 반복을 결정했습니다.여러 개의 재구성 목록을 팬더에 추가하십시오. DataFrame

나는 한 병원에있을 때 아래의 코드는 팬더 DataFrame 나에게 최종 결과의 올바른 형식을 제공합니다

import requests 
from bs4 import BeautifulSoup 
import pandas 
import numpy as np 
r=requests.get("http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile? 
hospitalName=Norfolk%20and%20Norwich%20Hospital") 
c=r.content 
soup=BeautifulSoup(c,"html.parser") 

all=soup.find_all(["div"],{"class":"toggle_container"})[1] 

i=0 
temp = [] 
for item in all.find_all("td"): 
    if i%4 ==0: 
     temp.append(soup.find_all("span")[4].text) 
     temp.append(soup.find_all("h5")[0].text) 
    temp.append(all.find_all("td")[i].text.replace(" ","")) 
    i=i+1 
table = np.array(temp).reshape(12,6) 
final = pandas.DataFrame(table) 
final 

내 반복 된 버전의를, 나는 각 결과 집합을 추가하는 방법을 알아낼 수 없습니다 최종 DataFrame로 :

hosplist = ["http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Norfolk%20and%20Norwich%20Hospital", 
      "http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Barnet%20Hospital", 
      "http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Altnagelvin%20Area%20Hospital"] 
temp2 = [] 
df_final = pandas.DataFrame() 
for item in hosplist: 
    r=requests.get(item) 
    c=r.content 
    soup=BeautifulSoup(c,"html.parser") 

    all=soup.find_all(["div"],{"class":"toggle_container"})[1] 
    i=0 
    temp = [] 
    for item in all.find_all("td"): 
     if i%4 ==0: 
      temp.append(soup.find_all("span")[4].text) 
      temp.append(soup.find_all("h5")[0].text) 
     temp.append(all.find_all("td")[i].text) 
     i=i+1 
    table = np.array(temp).reshape((int(len(temp)/6)),6) 
    temp2.append(table) 
    #df_final = pandas.DataFrame(df) 

말에서, '테이블'은 내가 원하는 모든 데이터를 가지고 있지만이 조작하기 쉽지 않다 그래서 나는 DataFrame에 넣어합니다. 그러나 "ValueError : 2-d 입력을 통과해야 함"오류가 발생합니다.

나는이 오류가 내가 3 차원으로 만드는 3 개의 배열을 가지고 있다고 말하고 있다고 생각한다. 이것은 연습 반복 일뿐 400 개가 넘는 병원에서 데이터를 데이터 프레임에 넣으 려하지만 여기에 붙어 있습니다.

+0

스택 추적 PLS. 추가 대신 확장을 사용 해보셨습니까? – skrubber

답변

1

코드를 약간 재구성하여 인코딩 할 필요없이 데이터 프레임을 만들 수있었습니다.

해결 방법 : 라인을 일으키는 동안 찾을 수

hosplist = ["http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Norfolk%20and%20Norwich%20Hospital", 
      "http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Barnet%20Hospital", 
      "http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Altnagelvin%20Area%20Hospital"] 
temp = [] 
temp2 = [] 
df_final = pandas.DataFrame() 
for item in hosplist: 
    r=requests.get(item) 
    c=r.content 
    soup=BeautifulSoup(c,"html.parser") 

    all=soup.find_all(["div"],{"class":"toggle_container"})[1] 
    i=0 

    for item in all.find_all("td"): 
     if i%4 ==0: 
      temp.append(soup.find_all("span")[4].text) 
      temp.append(soup.find_all("h5")[0].text) 
     temp.append(all.find_all("td")[i].text.replace("-","NaN").replace("+","")) 
     i=i+1 
temp2.append(temp) 
table = np.array(temp2).reshape((int(len(temp2[0])/6)),6) 
df_final = pandas.DataFrame(table, columns=['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) 
df_final 
+1

니스! 훨씬 더 청결한 지금. –

1

간단한 질문에 대한 답변은 HERE입니다.

어려운 부분은 코드를 가져 와서 아직 올바르지 않은 부분을 찾는 중입니다.

전체 코드를 사용하여 다음과 같이 수정했습니다. 귀하의 것으로 복사하여 차용하십시오.

import requests 
from bs4 import BeautifulSoup 
import pandas 
import numpy as np 

hosplist = ["http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Norfolk%20and%20Norwich%20Hospital", 
      "http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Barnet%20Hospital", 
      "http://www.njrsurgeonhospitalprofile.org.uk/HospitalProfile?hospitalName=Altnagelvin%20Area%20Hospital"] 
temp2 = [] 
df_final = pandas.DataFrame() 
for item in hosplist: 
    r=requests.get(item) 
    c=r.content 
    soup=BeautifulSoup(c,"html.parser") 

    all=soup.find_all(["div"],{"class":"toggle_container"})[1] 
    i=0 
    temp = [] 
    for item in all.find_all("td"): 
     if i%4 ==0: 
      temp.append(soup.find_all("span")[4].text) 
      temp.append(soup.find_all("h5")[0].text) 
     temp.append(all.find_all("td")[i].text) 
     i=i+1 
    table = np.array(temp).reshape((int(len(temp)/6)),6) 
    for array in table: 
     newArray = [] 
     for x in array: 
      try: 
       x = x.encode("ascii") 
      except: 
       x = 'cannot convert' 
      newArray.append(x) 
     temp2.append(newArray) 

df_final = pandas.DataFrame(temp2, columns=['h1', 'h2', 'h3', 'h4', 'h5', 'h6']) 
print df_final 

나는 문자열이 dataframe에 표시하기 위해 절대적으로 필요했다 아스키 변환을위한 지능형리스트를 사용하려고했으나 이해가 오류를 던지고, 그래서 나는 예외에 내장하고, 예외는 결코 보여주지 않는다.