2017-12-25 3 views
0

를 사용하여 div의에서 텍스트를 추출하는 방법 나는 그런 DIV를 containg HTML 페이지가 있습니다만 BeatifulSoup

<div class="item-content"> 
    <p>Bla bla bla <em>Name</em> Ba bla bla.</p> 
    <p>Bla bla bla.</p> 
    <p> <a href="https://example.com/link.htm"><img src="/image.gif" height="620" width="620" /></a></p> 
    <p><style> p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px...} </style></p> 
    <p>Bla bla bla <em>Name</em> Ba bla bla.</p> 
    <p>Bla bla bla.</p> 
</div> 

내 목표는 "즐 즐 즐 이름과 문자열을 얻을 것입니다 즐 즐 즐 .. . 이름 bla bla " 스타일 없음. 나는 <a><style>를 제외하는 관리이 사용

from bs4 import BeautifulSoup 

f = open('ogn2.html', 'r') 

html_doc = f.read() 

f.close() 

soup = BeautifulSoup(html_doc, 'html.parser') 

a = soup.find(attrs={"class": "item-content"}) 

b = a.find_all("p") 

text = "" 
a = 0 

for p in b: 
    a = a + 1 
    print(a, p.string) 
    if p.string and not p.style: 
     text = text + " " + p.string 

print(text) 

하지만 <p> - 라인이 <em> 같은 태그가 포함 된 경우 불행하게도 BeautifulSoup로 텍스트를 반환하지 않습니다 수행하기위한

그래서 그 코드를 사용합니다.

내가 뭘 잘못 했니? 또는 어쩌면 어떻게 더 똑똑한 방법으로 그것을 달성 할 수 있습니까? (줄 단위로 읽지 않고 다시 연결하는 것)?

는 편집 : 내가 그리워 무엇

는 태그가 포함 된 paragrapghs 있습니다

<p>Bla bla bla <em>Name</em> Ba bla bla.</p> 

그래서 내 원하는 결과 사이에 추가 태그없이 전체의 일반 텍스트이어야한다. 필터, 아래의 같은과에 대해

def filter_tags(element): 
    if element.parent.name in ['style']: 
    return False 
    return True 


texts = filter(filter_tags, soup.find(attrs={'class': 'item-content'}).find_all(text=True)) # This will return list of texts 

# You may apply join to concatenate. 
" ".join(texts) 
+0

* "유감스럽게도 BeautifulSoup은 점"*이 (가) 있으면 텍스트를 반환하지 않습니다. 뭐야? –

+0

HTML 태그는 [code formatting] (https://stackoverflow.com/editing-help#code)을 사용해야합니다. 또한 예상 출력과 실제 출력을 설명해 주시겠습니까 –

+2

'p.string' 대신'p.getText()'를 사용해보십시오. –

답변

0

.

0

p.text.strip() 선에만 포함 된 공백이 제거되었는지 확인합니다이

entries = [] 
for p in b: 
    if not p.style and p.text.strip(): 
     entries.append(p.text) 

text = " ".join(entries) 
print(text) 

여분의 상태를 시도하는 방법

0

이 시도 :

from bs4 import BeautifulSoup 

content = """ 
<div class="item-content"> 
    <p>Bla bla bla <em>Name</em> Ba bla bla.</p> 
    <p>Bla bla bla.</p> 
    <p> <a href="https://example.com/link.htm"><img src="/image.gif" height="620" width="620" /></a></p> 
    <p><style> p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px...} </style></p> 
    <p>Bla bla bla <em>Name</em> Ba bla bla.</p> 
    <p>Bla bla bla.</p> 
</div> 
""" 
soup = BeautifulSoup(content,"lxml") 
[item.extract() for item in soup.select("style")] 
items = "".join([item.text for item in soup.select(".item-content p")]) 
print(items) 

출력 :

Bla bla bla Name Ba bla bla.Bla bla bla. Bla bla bla Name Ba bla bla.Bla bla bla. 
0

해보십시오 p.getText() 대신 p.string의. - Martin Schmelzer

이것은 나를위한 가장 쉬운 방법이었습니다!

Martin!

+0

'.getText'는 비추천 인터페이스의 일부입니다. BS4에서'.get_text'를 사용하는 습관이 생겨야합니다. 아마 오래 걸리지 않을 것입니다. –