2016-03-29 4 views
1

私はstackoverflowを見渡しましたが、それでも解決策は見つかりません。Python:BeautifulSoupを使ってすべての<span>タグのすべてのテキストを取得できませんでした

......<span ><span class='pl'>Director </span>: <span class='attrs'><a href="/celebrity/1022571/" rel="v:directedBy">James</a></span></span><br/> 
<span ><span class='pl'>Actor</span>: <span class='attrs'><a href="/celebrity/1022571/">Tom</a></span></span><br/> 
<span class="pl">Countries:</span> USA <br/> 
<span class="pl">Language:</span> English <br/>...... 

は、ファイル内の多くのspanのタグがあります。 は、ここで私が対処する必要があるhtmlファイルです。私は上記のコードを使用し

from bs4 import BeautifulSoup 

record=[] 
soup=BeautifulSoup(html) 
spans=soup.find_all('span') 
for span in spans: 
    record.append(span.text) 

、と私は2問題を抱えて: はここに私のコードです。 最初は、DirectorActorの2倍を2 spanタグに入れているためです。 2番目の問題は、<br>タグの前にテキストを取得できないことです。私は私のプロジェクトにそのコードを追加する必要があるすべてのbrタグのために、それは迷惑だから

soup.find("span", text="Language:").next_sibling 

:私は、次のコードを使用する必要はありません。 優雅なソリューションがありますか?

答えて

1

一般的なものを書きたい場合は、次の兄弟タグ/テキストノードをnext_siblingまたはfind_next_siblingに配置する必要があります。ここで

は両方のケースを処理するコードである - ラベルの後の要素とテキストノードがあるとき:

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

for label in soup.find_all("span", class_="pl"): 
    value = label.find_next_sibling("span", class_="attrs") 
    value = label.next_sibling.strip() if not value else value.get_text(strip=True) 

    label = label.get_text(strip=True).strip(":") 
    print(label, value) 

プリント:

Director James 
Actor Tom 
Countries USA 
Language English 
関連する問題