2016-07-21 1 views
1

BS4 (python3)를 사용하여 HTML 파일에서 텍스트를 추출합니다. 내 파일은 다음과 같습니다 :beautiful_oup with get_text - 핸들 공간

<BODY> 
<P>Hello   World!</P> 
</BODY> 
</HTML> 

내가 get_text() 메소드를 호출, 출력은 "안녕하세요!". HTML이기 때문에 "Hello World!"를 얻을 것으로 예상됩니다. (두 개 이상의 공백은 HTML에서 한 공백으로 바뀝니다). 이 상황에 대한

이 관련도 : "안녕하세요"를

<BODY> 
<P>Hello  
World!</P> 
</BODY> 
</HTML> 

은 내가 찾을 예상 하지만 그것은 "Hello \ n World!"였습니다.

목표 달성 방법은 무엇입니까?

+0

원하는 사운드는 HTML을 렌더링하고 결과 텍스트 출력을 얻는 것과 같습니다. 이러한 유형의 변환을 수행하는 어딘가의 기능이 있어야합니다 (BS에서는 아닐 수도 있음). – theorifice

답변

0
문제가

,도 get_text(strip=True)도이 두 번째 경우에 p 요소에서 하나의 NavigableString이며이 값이 Hello\n World!입니다이기 때문에 .stripped_strings에 합류 여기에 작동합니다. 개행 문자는 텍스트 노드 안에 있습니다.

soup.p.get_text().replace("\n", "") 

또는, 또한 br 요소 (줄 바꿈으로 대체)을 처리하기 위해, 당신은 변환 기능을 할 수 있습니다 :

이 경우

, 수동으로 줄 바꿈을 교체 해야합니다 그것은 당신을 위해 텍스트를 준비합니다 :

from bs4 import BeautifulSoup, NavigableString 

data = """ 
<BODY> 

<P>Hello 
World!</P> 

<P>Hello 
<BR/> 
World!</P> 

</BODY> 
</HTML> 
""" 

def replace_with_newlines(element): 
    text = '' 
    for elem in element.children: 
     if isinstance(elem, NavigableString): 
      text += elem.replace("\n", "").strip() 
     elif elem.name == 'br': 
      text += '\n' 
    return text 

soup = BeautifulSoup(data, "html.parser") 

for p in soup.find_all("p"): 
    print(replace_with_newlines(p)) 

인쇄 (아무 줄 바꿈을 첫 번째 경우에, 하나의 줄 바꿈을 세코에서 nd) :

Hello World! 
Hello 
World! 
+0

좋은 시도이지만이 솔루션은 제한적입니다. "
"태그가 HTML에있는 경우는 어떻게됩니까? 이 경우 "\ n"이 출력되어야합니다 ... HTML은 내가 지원하고자하는 많은 규칙들을 포함하고 있습니다. – No1Lives4Ever

+0

@ No1Lives4Everpoint 좋은 점, 이해합니다. 더 많은 정보가 추가되었습니다. 어떤 경우에는 대안을 찾고 있습니다. 감사. – alecxe

+0

@ No1Lives4Ever 좋아요, 업데이트를보고 실제 사용 사례에서 테스트하십시오. 희망이 도움이됩니다. – alecxe