2013-10-24 3 views
0

일부 데이터의 경우 웹 페이지를 다운로드하여 TSV 형식으로 스크랩합니다. TSV 데이터 주변에는 원하지 않는 HTML이 있습니다.팬더를 사용하여 다른 곳에서 이미로드 된 CSV를 구문 분석하려면 어떻게해야합니까?

웹 페이지의 html을 다운로드하고 beautifulsoup를 사용하여 원하는 데이터를 긁어 냈습니다. 그러나 지금은 TSV 데이터를 메모리에 저장했습니다.

이 TSV 데이터를 팬더 메모리에서 어떻게 사용할 수 있습니까? 내가 찾을 수있는 모든 방법은 이미 긁어 낸 데이터가 아닌 파일이나 URI에서 읽는 것 같습니다.

텍스트를 다운로드하고 파일에 쓰고이를 다시 복제하고 싶지 않습니다. read_csv 같은

#!/usr/bin/env python2 

from pandas import pandas as p 
from BeautifulSoup import BeautifulSoup 
import urllib2 

def main(): 
    url = "URL" 
    html = urllib2.urlopen(url) 
    soup = BeautifulSoup(html) 
    # pre is the tag that the data is within 
    tab_sepd_vals = soup.pre.string 

    data = p.LOAD_CSV(tab_sepd_vals) 
    process(data) 
+0

'pandas.read_html'로 직접 읽을 수 있습니까? http://pandas.pydata.org/pandas-docs/dev/io.html#html – joris

+0

아니요, 왜냐하면 pandas.read_html은 bs4에 의존하고 python2를 사용하고 있습니다. – Squidly

답변

3

데이터의 문자/문자열 버전을 StringIO.StringIO (또는 Python 3.X의 io.StringIO)에 넣으면 해당 객체를 판다 파서에 전달할 수 있습니다. 따라서 코드는 다음과 같습니다.

#!/usr/bin/env python2 

import pandas as p 
from BeautifulSoup import BeautifulSoup 
import urllib2 
import StringIO 

def main(): 
    url = "URL" 
    html = urllib2.urlopen(url) 
    soup = BeautifulSoup(html) 
    # pre is the tag that the data is within 
    tab_sepd_vals = soup.pre.string 

    # make the StringIO object 
    tsv = StringIO.StringIO(tab_sepd_vals) 

    # something like this 
    data = p.read_csv(tsv, sep='\t') 

    # then what you had 
    process(data) 
+1

나는 전에 StringIO를 보지 않았으므로, 저 같은 호기심 많은 사람들을 위해 : http://docs.python.org/2/library/stringio.html - 파일이 예상되는 곳에 문자열을 사용할 수 있습니다. – Squidly

1

방법은 두 가지를, 그들은 DataFrame 객체를 CSV하고 construct을 구문 분석 - 그래서 귀하의 경우에 당신이 DataFrame 직접 구성 할 수 있습니다 :

>>> import pandas as pd 
>>> df = pd.DataFrame([['a', 1], ['b', 2], ['c', 3]]) 
>>> print(df) 
    0 1 
0 a 1 
1 b 2 
2 c 3 

이 생성자는 다양한 받아 데이터 구조

+0

하지만 CSV 파서도 필요합니다. IO 구성 요소. – Squidly

관련 문제