2017-05-05 23 views
1

私は、次のしている:Python + BeautifulSoup: 'a'要素の 'href'属性を取得するには?

html = 
    '''<div class=“file-one”> 
    <a href=“/file-one/additional” class=“file-link"> 
     <h3 class=“file-name”>File One</h3> 
    </a> 
    <div class=“location”> 
     Down 
    </div> 
    </div>''' 

そして/file-one/additionalあるhrefのテキストだけを取得したいと思います。だから私はした:

from bs4 import BeautifulSoup 

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

link_text = “” 

for a in soup.find_all(‘a’, href=True, text=True): 
    link_text = a[‘href’] 

print “Link: “ + link_text 

しかし、それだけで、何も何も印刷されません。ただLink:。だから私は別のサイトでそれをテストしましたが、別のHTMLを使ってテストしました。

私は間違っていますか?または、意図的にhrefを返さないようにサイトが設定されている可能性はありますか?

ありがとうございますupvote/answerを受け入れるようにしてください!

+1

実際にあなたのHTMLには中括弧が含まれていますか? – user2357112

+1

そのため、あなたの*コード*に中括弧が入っているのはなぜですか?あなたは何をコーディングしていますか?テキストエディタを使用する必要があります。 – user2357112

+0

パラメータ 'text = True'を削除すると、あなたのコードは私のために機能します – davedwards

答えて

3
  1. 最初に、中括弧引用符を使用しない別のテキストエディタを使用してください。

  2. 第二に、soup.find_all

7

からtext=Trueフラグを削除してHTMLで「」タグは、直接、任意のテキストを持っていますが、いくつかのテキストを持っている「H3」タグが含まれていません。つまり、textNoneであるため、find_allはタグを選択しません。

nameおよびhrefパラメータのみを使用してタグを選択し、ループ内に条件を追加してタグにテキストがあるかどうかを確認する場合は、この問題を解決できます。

links_with_text = [] 
for a in soup.find_all('a', href=True): 
    if a.text: 
     links_with_text.append(a['href']) 

また、ワンライナーが好きな場合は、リスト内包表記を使用することもできます。

links_with_text = [a['href'] for a in soup.find_all('a', href=True) if a.text] 

それともfind_alllambdaを渡すことができます。

tags = soup.find_all(lambda tag: tag.name == 'a' and tag.get('href') and tag.text) 
関連する問題