2017-03-11 23 views
1

私はPythonを学ぶのが本当に新しいので、これは本当に明白かもしれませんが、BeautifulSoupからNavigableStringを抽出しました。しかし、それは私がオンラインで見たいくつかの例ほど簡単ではありません。Beautiful Soup/Regular Expressions:NavigableStringからテキストの一部を抽出する

私の最終目標は、次のようになります辞書作成することです。ここでは

dict = {'Fandom':'Undertale (Video Game)', 'Works':15341} 

のは、文字列の2つの例です:

<li> 
<a class="tag" href="/tags/Undertale%20(Video%20Game)/works">Undertale (Video Game)</a> 
      (15341) 
     </li> 

<a class="tag" href="/tags/Sherlock%20Holmes%20*a*%20Related%20Fandoms/works">Sherlock Holmes &amp; Related Fandoms</a> 
      (101015) 
     </li> 

は、私はすでに文字列からファンダムを抽出成功しましたしかし、今では括弧内に作品数が必要です。これを行うには、美しいスープや正規表現をどのように使用しますか?

また、常にランダムに表示されますが、隣に仕事数がないため、エラー処理が必要です。

<li> 
<a class="tag" href="/tags/Composer%20-%20Fandom/works">Composer - Fandom</a> 
</li> 

は、ここでは、コードの関連部分です:

 for each_f in cate: 
      #print(each_f) 
      result = each_f.find('a') 
      if result !=-1: 
       #here is where I grab the Fandom vals 
       fandom_name = result.contents 
       #print(result.contents) 

注:私は辞書に追加するコードを欠けている知って、私はそこまでまだそれを行っていません。私は画面に印刷するための値を取得しようとしています。

答えて

0

使用dict.fromkeys(('Fandom', 'Works'))liタグ内の文字列でキーを兼ね備えする

In [17]: dict.fromkeys(('Fandom', 'Works')) 
Out[17]: {'Fandom': None, 'Works': None} 

使用zip、これが唯一の最短を組み合わせます:

zip(('Fandom', 'Works'),li.stripped_strings) 

[('Fandom', 'Undertale (Video Game)'), ('Works', '(15341)')] 
[('Fandom', 'Sherlock Holmes & Related Fandoms'), ('Works', '(101015)')] 
[('Fandom', 'Composer - Fandom')] 

その後、我々はそれらとdictを更新データ:

In [20]: for li in soup.find_all('li'): 
    ...:  d = dict.fromkeys(('Fandom', 'Works')) 
    ...:  out = zip(('Fandom', 'Works'),li.stripped_strings) 
    ...:  d.update(out) 
    ...:  print(d) 

out:

{'Works': '(15341)', 'Fandom': 'Undertale (Video Game)'} 
{'Works': '(101015)', 'Fandom': 'Sherlock Holmes & Related Fandoms'} 
{'Works': None, 'Fandom': 'Composer - Fandom'} 
+1

これはちょっと修正する必要がありました。なぜなら、zipがそれほど気に入らなかったからです。返された文字列を取り除く:out = [( 'F'、 'W'、u'Undertale(Video Game) ')、(' a '、' o '、u'(15343) ')]。しかし、それは私を答えに近づけるので、ありがとう! – SpaceyJo

0

stripped_stringsを使用して値を展開して、テキストブロックを取得することができます。後で使用できるように、結果をdictに保存することができます。

例:

from bs4 import BeautifulSoup 
import requests 


example = """<li> 
<a class="tag" href="/tags/Undertale%20(Video%20Game)/works">Undertale (Video Game)</a> 
     (15341) 
    </li> 

<li><a class="tag"  href="/tags/Sherlock%20Holmes%20*a*%20Related%20Fandoms/works">Sherlock Holmes &amp; Related Fandoms</a> 
     (101015) 
    </li> 
    <li> 
<a class="tag" href="/tags/Composer%20-%20Fandom/works">Composer - Fandom</a> 
</li>""" 

soup = BeautifulSoup(example, "html.parser") 
Fandom = {"Fandom" : []} 

for li in soup.find_all("li"): 
    try: 
     fandom, count = li.stripped_strings 
     Fandom["Fandom"].append({fandom.strip() : count[1:-1]}) 
    except: 
     fandom = li.text.strip() 
     Fandom["Fandom"].append({fandom.strip() : 0}) 

print (Fandom) 

この出力:

{ 'ファンダム':[{ 'Undertale(ビデオゲーム)': '15341'}、{ 'シャーロック・ホームズ&関連Fandoms' :'101015 '}、{' Composer - Fandom ':0}]}

try-catchは、2つの値を含まないアンパックを捕捉します:あなたのファンダメンタルタイトルと単語カウント。取得する

関連する問題