web-dev-qa-db-ja.com

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>'''

そして、hrefのテキストだけを取得したいのですが、これは/file-one/additional。だから私はやった:

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を返さないように意図的にプログラムされている可能性はありますか?

よろしくお願いします。必ず答えてください。

9
user3259472

HTMLの「a」タグには直接テキストはありませんが、テキストを含む「h3」タグが含まれています。つまり、textはNoneであり、.find_all()はタグの選択に失敗します。通常、タグにテキストコンテンツ以外の他のhtml要素が含まれる場合は、textパラメーターを使用しないでください。

タグの名前(およびhrefキーワード引数)のみを使用して要素を選択すると、この問題を解決できます。次に、ループに条件を追加して、テキストが含まれているかどうかを確認します。

_soup = BeautifulSoup(html, 'html.parser')
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]
_

または、 lambda.find_all()に渡すこともできます。

_tags = soup.find_all(lambda tag: tag.name == 'a' and tag.get('href') and tag.text)
_

テキストの有無に関係なくすべてのリンクを収集する場合は、「href」属性を持つすべての「a」タグを選択します。通常、アンカータグにはリンクがありますが、これは要件ではないため、href引数を使用するのが最善だと思います。

.find_all()を使用します。

_links = [a['href'] for a in soup.find_all('a', href=True)]
_

CSSセレクターで.select()を使用します。

_links = [a['href'] for a in soup.select('a[href]')]
_
16
t.m.adam
  1. まず、中括弧を使用しない別のテキストエディターを使用します。

  2. 次に、text=Trueからsoup.find_allフラグを削除します

4

また、attrsを使用して、正規表現検索でhrefタグを取得することもできます。

soup.find('a', href = re.compile(r'[/]([a-z]|[A-Z])\w+')).attrs['href']
3
Rakshit Vats