2016-08-14 2 views
0

BeautifulSoup 및 Python을 사용하여 데이터를 온라인으로 긁어내는 자체 프로젝트가 있습니다. 역사적인 주식 데이터는 제가 연습하기에 좋은 자료라고 생각합니다. 나는 소스 코드 here을보고 BeautifulSoup의 select() 또는 findall()을 사용하여 테이블에서 데이터의 일부분을 파싱하는 방법을 분석했다. 여기 내가 사용하는 코드가 있지만 테이블 이외의 구문을 파싱했습니다.BeautifulSoup을 사용하여 데이터의 테이블 구문 분석

soup = bs4.BeautifulSoup(res.text, 'lxml') table = soup.findAll('td', {'class':'yfnc_tabledata1'}) print table

내 질문 : 어떻게 테이블에서 데이터의 이일을 보여주는 만 2 개 행을 구문 분석?

가 가
<table class="yfnc_datamodoutline1" width="100%" cellpadding="0" cellspacing="0" border="0"> 

<tr valign="top"> 
<td> 

<table border="0" cellpadding="2" cellspacing="1" width="100%"> 
<tr> 
<th scope="col" class="yfnc_tablehead1" align="right" width="16%">Date</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">Open</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">High</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">Low</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="12%">close</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="16%">Volume</th> 
<th scope="col" class="yfnc_tablehead1" align="right" width="15%">Adj Close*</th> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" nowrap align="right">12 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.44</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
<td class="yfnc_tabledata1" align="right">18,612,300</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" nowrap align="right">11 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">108.52</td> 
<td class="yfnc_tabledata1" align="right">108.93</td> 
<td class="yfnc_tabledata1" align="right">107.85</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
<td class="yfnc_tabledata1" align="right">27,484,500</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" colspan="7" align="center"> 
* <small>Close price adjusted for dividends and splits.</small> 
</td> 
</tr> 
</table> 

</td> 
</tr> 
</table> 
난 단지 위에서 데이터의 특정이 행을 필요

:

<tr> 
<td class="yfnc_tabledata1" nowrap align="right">12 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.44</td> 
<td class="yfnc_tabledata1" align="right">107.78</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
<td class="yfnc_tabledata1" align="right">18,612,300</td> 
<td class="yfnc_tabledata1" align="right">108.18</td> 
</tr> 
<tr> 
<td class="yfnc_tabledata1" nowrap align="right">11 Aug 2016</td> 
<td class="yfnc_tabledata1" align="right">108.52</td> 
<td class="yfnc_tabledata1" align="right">108.93</td> 
<td class="yfnc_tabledata1" align="right">107.85</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
<td class="yfnc_tabledata1" align="right">27,484,500</td> 
<td class="yfnc_tabledata1" align="right">107.93</td> 
</tr> 
+1

중첩 수준이 어떻게 다른지 알 수 없습니다. 테이블을 얻기 위해'find()'를 사용하면 중첩에 대해 걱정할 필요없이 자식에 액세스 할 수 있습니다. 너 진짜 문제가 뭐니? 테이블을 찾는 데 문제가 있습니까? –

+0

나는 테이블을 파싱 할뿐만 아니라 다른 부분도 웹 페이지를 파싱한다. –

답변

0

당신은 모든 행을 선택할 수 있습니다 여기에

은 기록 데이터 2 일이있는 테이블 yfnc_datamodoutline1 테이블의 중첩 테이블에서 첫 번째 및 두 번째 색인을 생성하십시오.

soup = BeautifulSoup(html) 
table_rows = soup.select("table.yfnc_datamodoutline1 table tr + tr") 
row1, row2 = table_rows[0:2] 

print(row1) 
print(row2) 
,451,515,

당신에게 줄 것이다 :

print([td.text for td in row1.find_all("td")]) 
print([td.text for td in row2.find_all("td")]) 

당신에게 줄 것이다 :

[u'12 Aug 2016', u'107.78', u'108.44', u'107.78', u'108.18', u'18,612,300', u'108.18'] 
[u'11 Aug 2016', u'108.52', u'108.93', u'107.85', u'107.93', u'27,484,500', u'107.93'] 

table.yfnc_datamodoutline1

<tr> 
<td align="right" class="yfnc_tabledata1" nowrap="">12 Aug 2016</td> 
<td align="right" class="yfnc_tabledata1">107.78</td> 
<td align="right" class="yfnc_tabledata1">108.44</td> 
<td align="right" class="yfnc_tabledata1">107.78</td> 
<td align="right" class="yfnc_tabledata1">108.18</td> 
<td align="right" class="yfnc_tabledata1">18,612,300</td> 
<td align="right" class="yfnc_tabledata1">108.18</td> 
</tr> 
<tr> 
<td align="right" class="yfnc_tabledata1" nowrap="">11 Aug 2016</td> 
<td align="right" class="yfnc_tabledata1">108.52</td> 
<td align="right" class="yfnc_tabledata1">108.93</td> 
<td align="right" class="yfnc_tabledata1">107.85</td> 
<td align="right" class="yfnc_tabledata1">107.93</td> 
<td align="right" class="yfnc_tabledata1">27,484,500</td> 
<td align="right" class="yfnc_tabledata1">107.93</td> 
</tr> 

는 TD 데이터는 단지 각 TD에서 텍스트를 추출 얻으려면 table tr + tr은 헤더 행 인 첫 번째를 건너 뛰는 내부 테이블 안의 모든 행을 선택합니다.

+0

table.yfnc_datamodoutline1 table tr + tr은 2 행을 파싱합니다. 파싱 ​​할 데이터의 행 수가 다른 경우 수행 할 작업은 무엇입니까? –

+0

@LEDFantom, 나는 당신이'mean.table.yfnc_datamodoutline1 table tr + tr parses'가 첫번째 행을 포함하지 않는 모든 행들을 파싱하는지 이해하지 못한다. –

관련 문제