私は次のものを持っています:
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
を返さないように意図的にプログラムされている可能性はありますか?
よろしくお願いします。必ず答えてください。
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]')]
_
まず、中括弧を使用しない別のテキストエディターを使用します。
次に、text=True
からsoup.find_all
フラグを削除します
また、attrsを使用して、正規表現検索でhrefタグを取得することもできます。
soup.find('a', href = re.compile(r'[/]([a-z]|[A-Z])\w+')).attrs['href']