2013-04-10 2 views
1

내가 파이썬/BeautifulSoup로와 HTML 테이블을 구문 분석 찾고있다 ...BeautifulSoup로 태그 제거

이 파이썬에서 아무것도 코딩에서 내 첫 번째 시도, 그래서 그것의 가장 효율적인 아마입니다.

여기에 다른 게시물 기능을 부여했지만 (대부분 잘 작동 함) 몇 가지 문제가 있습니다.

내가 실행하고 코드는 여기에 있습니다 : 나는 strip_tags 함수를 실행하면

<td align="left">11/10</td> 
<td>N ARMY</td> 
<td>-7.5</td> 
<td>NL</td> 
<td><b>76-65</b></td> 
<td><span style="color:green">W</span></td> 
<td><span style="color:green">W</span></td> 
<td></td> 
<td class="cell4">50.0%</td> 
<td class="cell4">76.9%</td> 
<td class="cell4">37.5%</td> 
<td class="cell5">37.1%</td> 
<td class="cell5">90.0%</td> 
<td class="cell5">29.4%</td> 

는, 그것은 모든 태그 작동 :

def strip_tags(html, invalid_tags): 
    bs2 = BeautifulSoup(str(html)) 
    for tag in bs2.findAll(True): 
     if tag.name in invalid_tags: 
      s = ""  

      for c in tag.contents: 
       if not isinstance(c, NavigableString): 
        c = strip_tags(unicode(c), invalid_tags) 
       s += unicode(c) 

      tag.replaceWith(s) 
    return bs2 

invalid_tags = ['td','b'] 

for row in bs.findAll('tr'): 
    col = row.findAll('td') 

for index,item in enumerate(col): 
    t = item.findAll('a') 
    for ta in t: 
     ta.replaceWithChildren() 
     col[index] == item 

for item in col: 
    print(strip_tags(item.string,invalid_tags).string 

원시 데이터 테이블 (HTML)는 다음과 같습니다 두 번째 줄을 제외하고 ... 'None'이 출력으로 반환됩니다.

누군가가 왜 이런 일이 발생했는지에 대한 통찰력을 제공 할 수 있다면 크게 감사하겠습니다.

편집 : 누구나 빠른 답변을드립니다. 대신 'N ARMY'의 '없음'을 반환 곳

 
11/10 
None 
-7.5 
NL 
76-65 
W 
W 
None 
50.0% 
76.9% 
37.5% 
37.1% 
90.0% 
29.4%

문제는, 두 번째 줄 주위에있다 : 어쨌든, 여기에 내가 코드를 실행할 때 발생하는 것입니다. 그래서 예, 이상적으로는 태그 내에있는 텍스트 만 원합니다.

+2

가 대신 어떤 출력을 찾고 :

from bs4 import BeautifulSoup with open('test.html', 'rb') as html: #My local version of your html file soup = BeautifulSoup(html.read()) for td in soup.find_all('td'): print td.get_text() 

이 출력을 준다? BeautifulSoup은 또한'.stripped_strings' iterable을 가지고 있는데, 당신이 원한다면 그 테이블의 텍스트 만 있으면된다. –

+0

들여 쓰기가 보입니다. 'for 인덱스, 열거 형 (col) :'및'for item in col :'블록은 앞의'for' 루프의 일부분으로 들여 쓰기해야합니다. –

+0

입력 HTML을 제공했지만 원하는 결과물을 혼동합니다. * 반환해야 할 내용을 게시 할 수 있습니까? –

답변

1

올바르게 출력하고 싶다면 직접 태그를 제거 할 필요가 없습니다. 그 이유는 BeautifulSoup입니다! ;)

인스턴스의 get_text() 메서드는 find_all()이 반환합니다.

<table> 
    <tr> 
     <td align="left">11/10</td> 
     <td>N ARMY</td> 
     <td>-7.5</td> 
     <td>NL</td> 
     <td><b>76-65</b></td> 
     <td><span style="color:green">W</span></td> 
     <td><span style="color:green">W</span></td> 
     <td></td> 
     <td class="cell4">50.0%</td> 
     <td class="cell4">76.9%</td> 
     <td class="cell4">37.5%</td> 
     <td class="cell5">37.1%</td> 
     <td class="cell5">90.0%</td> 
     <td class="cell5">29.4%</td> 
    </tr> 
</table> 
td의 이상

간단한 반복하고 get_text()에게 전화를하고 우리가 갈 수 있어요 :

샘플 HTML을 사용!

11/10 
N ARMY 
-7.5 
NL 
76-65 
W 
W 

50.0% 
76.9% 
37.5% 
37.1% 
90.0% 
29.4% 
[Finished in 0.1s] 
+0

정말 대단합니다. 정말 고마워. – user2267232