2016-08-12 20 views
0

私は<a>タグの兄弟構造を歩みようとしており、その間に<br>タグがあります。 brタグのelem.nameを取得しようとすると、エラーが発生します。これらのbrタグをスキップする方法はありますか?<br>タグ

現在、解析する前にhtml = html.replace('<br>','\n')を実行していますが、それはbsoupに改行で^ M文字を挿入させます。

r = requests.get(url, headers=headers) 
    # page = r.text.replace('<br>','\n') 
    soup = bsoup(r.text, 'html.parser') 
    soup = soup.find('div', id='listAlbum') 
    albums = soup.find_all('div', class_='album') 
    for album in albums: 
      name = album.text.replace('"','').replace(':','').rstrip() 
      print(name) 
      albumtask(name) 
      song = album.next_sibling 
      while song.name != 'div' and song.name != 'script': 
        if song.name != 'a' or song.get('id'): 
          song = song.next_sibling 
          continue 
        t = threading.Thread(target=tsong, args=(song,)) 
        t.start() 
        song = song.next_sibling 
        while song.is_empty_element: 
          song = song.next_sibling 
        time.sleep(0.2) 

 

<div id="listAlbum"> 
<a id="1545"></a><div class="album">album: <b>"Pablo Honey"</b> (1993)<span>&nbsp;&nbsp;<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=RADIOHEAD+Pablo+Honey&amp;tag=azlyricsunive-20&amp;index=music&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325" rel="external"><img width="30" height="18" src="http://images.azlyrics.com/amn.png" alt="buy this CD or download MP3s at amazon.com!"></a></span></div> 
<a href="../lyrics/radiohead/you.html" target="_blank">You</a><br> 
<a href="../lyrics/radiohead/creep.html" target="_blank">Creep</a><br> 
<a href="../lyrics/radiohead/howdoyou.html" target="_blank">How Do You?</a><br> 
<a href="../lyrics/radiohead/stopwhispering.html" target="_blank">Stop Whispering</a><br> 
<a href="../lyrics/radiohead/thinkingaboutyou.html" target="_blank">Thinking About You</a><br> 
<a href="../lyrics/radiohead/anyonecanplayguitar.html" target="_blank">Anyone Can Play Guitar</a><br> 
<a href="../lyrics/radiohead/ripcord.html" target="_blank">Ripcord</a><br> 
<a href="../lyrics/radiohead/vegetable.html" target="_blank">Vegetable</a><br> 
<a href="../lyrics/radiohead/proveyourself.html" target="_blank">Prove Yourself</a><br> 
<a href="../lyrics/radiohead/icant.html" target="_blank">I Can't</a><br> 
<a href="../lyrics/radiohead/lurgee.html" target="_blank">Lurgee</a><br> 
<a href="../lyrics/radiohead/blowout.html" target="_blank">Blow Out</a><br> 

<a id="1543"></a><div class="album">EP: <b>"My Iron Lung"</b> (1994)<span>&nbsp;&nbsp;<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=RADIOHEAD+My+Iron+Lung&amp;tag=azlyricsunive-20&amp;index=music&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325" rel="external"><img width="30" height="18" src="http://images.azlyrics.com/amn.png" alt="buy this CD or download MP3s at amazon.com!"></a></span></div> 
<a href="../lyrics/radiohead/myironlung.html" target="_blank">My Iron Lung</a><br> 

そして、それはそのように続けます。

+0

ちょっとオフトピック(と私はPythonや美しいスープの何も知らない)が、HTMLの用語で、
年代を削除し、使用して移動する、おそらく良い時間要素間にスペーシング/パディング/マージンを作成するCSS(またはの場合は "display:block"を使用します)。表示のために改行を使用することは、表示目的で使用されるCSSでよりよく行われます。 – gavgrif

+0

しかし、この場合私のHTMLではありません。 – user193661

+0

@ user193661このサンプルでは、​​サンプル入力HTMLと望ましい出力を提供できますか?本当に助けになるでしょう。 – alecxe

答えて

1

私はすべてのアルバムを最初に繰り返します。これは、#listAlbum .album CSSセレクタと一致する要素です。さて、すべてのアルバムについて、find all a following siblingsと繰り返して曲のタイトルを集めてください。 idの要素に遭遇すると、壊れます。実装:

from collections import defaultdict 
from pprint import pprint 

from bs4 import BeautifulSoup 


data = """ 
<div id="listAlbum"> 
    <a id="1545"></a><div class="album">album: <b>"Pablo Honey"</b> (1993)<span>&nbsp;&nbsp;<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=RADIOHEAD+Pablo+Honey&amp;tag=azlyricsunive-20&amp;index=music&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325" rel="external"><img width="30" height="18" src="http://images.azlyrics.com/amn.png" alt="buy this CD or download MP3s at amazon.com!"></a></span></div> 
    <a href="../lyrics/radiohead/you.html" target="_blank">You</a><br> 
    <a href="../lyrics/radiohead/creep.html" target="_blank">Creep</a><br> 
    <a href="../lyrics/radiohead/howdoyou.html" target="_blank">How Do You?</a><br> 
    <a href="../lyrics/radiohead/stopwhispering.html" target="_blank">Stop Whispering</a><br> 
    <a href="../lyrics/radiohead/thinkingaboutyou.html" target="_blank">Thinking About You</a><br> 
    <a href="../lyrics/radiohead/anyonecanplayguitar.html" target="_blank">Anyone Can Play Guitar</a><br> 
    <a href="../lyrics/radiohead/ripcord.html" target="_blank">Ripcord</a><br> 
    <a href="../lyrics/radiohead/vegetable.html" target="_blank">Vegetable</a><br> 
    <a href="../lyrics/radiohead/proveyourself.html" target="_blank">Prove Yourself</a><br> 
    <a href="../lyrics/radiohead/icant.html" target="_blank">I Can't</a><br> 
    <a href="../lyrics/radiohead/lurgee.html" target="_blank">Lurgee</a><br> 
    <a href="../lyrics/radiohead/blowout.html" target="_blank">Blow Out</a><br> 

    <a id="1543"></a><div class="album">EP: <b>"My Iron Lung"</b> (1994)<span>&nbsp;&nbsp;<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=RADIOHEAD+My+Iron+Lung&amp;tag=azlyricsunive-20&amp;index=music&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325" rel="external"><img width="30" height="18" src="http://images.azlyrics.com/amn.png" alt="buy this CD or download MP3s at amazon.com!"></a></span></div> 
    <a href="../lyrics/radiohead/myironlung.html" target="_blank">My Iron Lung</a><br> 
</div>""" 

soup = BeautifulSoup(data, "html5lib") 
albums = defaultdict(list) 
for album in soup.select("#listAlbum .album"): 
    album_title = album.get_text().strip() 
    for song in album.find_next_siblings("a"): 
     if "id" in song.attrs: 
      break 

     song_title = song.get_text(strip=True) 
     albums[album_title].append(song_title) 

pprint(dict(albums)) 

プリント:

{'EP: "My Iron Lung" (1994)': ['My Iron Lung'], 
'album: "Pablo Honey" (1993)': ['You', 
           'Creep', 
           'How Do You?', 
           'Stop Whispering', 
           'Thinking About You', 
           'Anyone Can Play Guitar', 
           'Ripcord', 
           'Vegetable', 
           'Prove Yourself', 
           "I Can't", 
           'Lurgee', 
           'Blow Out']}