2017-07-28 16 views
1

家族のメンバーがポッドキャストをサイトからダウンロードするのを助ける小さなツールを作りたいと思います。beautifulsoupを使用して.mp3リンクをフィルタリングするにはどうすればよいでしょうか? (JSON)

ファイルへのリンクを取得するには、まずそれらをフィルタリングする必要があります(bs4 + python3を使用)。 ファイルは、このウェブサイト(エストニア)にある:Download Page「Laadiのアラは」=「ダウンロード」

これまでのところ、次のように私のコードがある

from bs4 import BeautifulSoup 

import urllib.request 
import re 

url = urllib.request.urlopen("http://vikerraadio.err.ee/listing/mystiline_venemaa#?page=1&pagesize=902&phrase=&from=&to=&path=mystiline_venemaa&showAll") 
content = url.read() 
soup = BeautifulSoup(content, "lxml") 

links = [a['href'] for a in soup.find_all('a',href=re.compile('http.*\.mp3'))] 
print ("Links:", links) 
(そのほとんどはstackoverflowの上の例からです)

残念ながら私は常に2つの結果しか得ていません。 出力:

Links: ['http://heli.err.ee/helid/exp/ERR_raadiouudised.mp3', 'http://heli.err.ee/helid/exp/ERR_raadiouudised.mp3'] 

これらは私が望むものではありません。 私の最高の推測では、ページに多少のHTMLの壊れがあり、bs4 /パーサーは他のものを見つけることができないということです。 違うパーサーを試してみましたが、結果は変わりません。 多分私は別の何かを間違ってやっている。

私の目標は、例えばリスト内に個々のリンクを置くことです。 私は、後で自分で重複した/不要な項目を除外します。

これは公共ラジオであり、すべてのコンテンツは合法的にホストされています。

私の新しいコードは次のとおりです。

for link in soup.find_all('d2p1:DownloadUrl'): 
    print(link.text) 

タグが正しく選択されている場合、私は非常にわからないと思います。

に記載されている例はありません。は実際に動作しています。作業コードについては、以下の回答を参照してください。

+0

ページはJavaScriptでレンダリングされています。JavaScriptでレンダリングされたWebページをスクラップする方法の詳細については、https://stackoverflow.com/questions/45259232/scraping-google-finance-beautifulsoup/45259523#45259523への私の回答を参照してください。 –

答えて

2

ページのリストは、APIでインターフェイスされていますのでご注意ください。したがって、HTMLページをリクエストする代わりに、200の.mp3リンクを持つAPIリンクをリクエストすることをお勧めします。

以下の手順に従ってください:APIリンクではなく、HTMLページのリンク

    1. 要求は応答を確認し、それはJSONです。だからあなたの必要性
    2. ヘルプご家族のフィールドを抽出し、すべての時間:)

    ソリューション

    import requests, json 
    from bs4 import BeautifulSoup 
    
    myurl = 'http://vikerraadio.err.ee/api/listing/bypath?path=mystiline_venemaa&page=1&pagesize=200&phrase=&from=&to=&showAll=false' 
    r = requests.get(myurl) 
    abc = json.loads(r.text) 
    
    all_mp3 = {} 
    for lstngs in abc['ListItems']: 
        for asd in lstngs['Podcasts']: 
         all_mp3[asd['DownloadUrl']] = lstngs['Header'] 
    
    all_mp3 
    

    all_mp3は何が必要です。 all_mp3はキーとしてダウンロードURLmp3の名前値としてと辞書です。

  • +0

    私の最善を尽くしましたが、私はそれをする方法を理解できません。私の新しいコードは soup.find_all( 'd2p1:DownloadUrl')のリンクです: print(link.text) タグが正しく選択されているかどうかは非常にわかりません。 – Manuauto

    +0

    @Manuauto:レスポンスはJSON(キーと値のペア)で、キーを使用して必要性(値)を抽出する必要があります。私はあなたがそれに取り組むことをお勧めします。あなたが必要とする**ソリューション**を試して投稿したと思います。更新された応答を確認してください。 –

    +0

    ありがとうございます。このコードは非常にうまく機能します。私はそれを自分でプログラムすることはできませんでした。ここでは、それを拡張する方法を知り、さらなる機能を追加します。最も重要なのは、データを最初に取得する方法です。 – Manuauto

    関連する問題