2017-12-25 16 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 " スタイルは何もない。私は<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> -lineが<em>のようなタグが含まれている場合は、残念ながらBeautifulSoupは、テキストを返しません:実行するための

はので、私は、そのコードを使用します。

どうすればいいですか?あるいは、より賢明な方法でそれを達成するにはどうすればよいでしょうか?

EDIT:

私は欠場何がタグを含むparagrapghsです:

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

だから私の望ましい結果は、その間の任意の追加タグなしで全体のプレーンテキストでなければなりません。

+0

*「残念ながら、BeautifulSoupはドット「*?何のドット? –

+0

HTMLタグは[code formatting](https://stackoverflow.com/editing-help#code)を使用する必要があります。また、期待される出力と実際の出力を説明することもできます –

+2

'p.string'ではなく' p.getText() 'を試してみてください。 –

答えて

0

どのようにフィルタを用いて約、以下のようなもの、

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

は、余分な条件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

これは私にとって最も簡単な方法でした。

ありがとうございました!

+0

'.getText'は廃止されたインターフェースの一部ですので、実際にBS4の' .get_text'を使うのは慣れているはずです。 –