2017-03-04 1 views
2

텍스트, 표 및 html로 여러 웹 페이지를 구문 분석하려고합니다. 모든 페이지의 단락 수는 다르지만 모든 단락은 <div>으로 시작하지만 끝까지 </div>은 종료되지 않습니다. text1 <b>text2</b> (table_deleted) text3BeautifulSoup을 사용하여 중첩 된 div 구문 분석

실제 결과 text1\n\ntext2some text heretext 3text2some text heretext 3 (table deleted)

from bs4 import BeautifulSoup 

html = """ 
<h1>title</h1> 
<h3>extra data</h3> 
<div> 
    text1 
    <div> 
     <b>next2</b><table>some text here</table>text 3 
    </div> 
</div>""" 

soup = BeautifulSoup(html, 'html5lib') 
tags = soup.find('h3').find_all_next() 
contents = "" 
for tag in tags: 
    if tag.name == 'table': 
     contents += " (table deleted) " 

    contents += tag.text.strip() 

print(contents) 
+0

을 사용하여 "테이블"태그를 대체하고 변경할 수 있습니다, 왜 구문 분석 선조? – putonspectacles

+0

허. 나는 나 자신을 위해 어려운 일을하는 것을 좋아한다. 그것은 정말로 효과가 있습니다. :) – bluppfisk

답변

0

대신 파서로 html5lib를 사용하지 마십시오 : 난 그냥

원하는 결과 특정 요소를 필터링하고 다른 무언가에 의해 그들을 대체 컨텐츠를 얻으려고 html.parser을 사용하십시오. 즉, css selectorselect_one 방법을 사용하여 "h3"태그 바로 뒤에있는 "div"에 액세스 할 수 있습니다. 거기에서

, 다음 "DIV"태그를 unwrap 왜 그냥 테이블 태그를 찾을하지 않는 replace_with 방법

In [107]: from bs4 import BeautifulSoup 

In [108]: html = """ 
    ...: <h1>title</h1> 
    ...: <h3>extra data</h3> 
    ...: <div> 
    ...:  text1 
    ...:  <div> 
    ...:   <b>next2</b><table>some text here</table>text 3 
    ...:  </div> 
    ...: </div>""" 

In [109]: soup = BeautifulSoup(html, 'html.parser') 

In [110]: my_div = soup.select_one('h3 + div') 

In [111]: my_div 
Out[111]: 
<div> 
    text1 
    <div> 
<b>next2</b><table>some text here</table>text 3 
    </div> 
</div> 

In [112]: my_div.div.unwrap() 
Out[112]: <div></div> 

In [113]: my_div 
Out[113]: 
<div> 
    text1 

<b>next2</b><table>some text here</table>text 3 

</div> 

In [114]: my_div.table.replace_with('(table deleted)') 
Out[114]: <table>some text here</table> 

In [115]: my_div 
Out[115]: 
<div> 
    text1 

<b>next2</b>(table deleted)text 3 

</div> 
관련 문제