質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

2479閲覧

BeautifulSoupを使ったタグの情報の取得がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2017/03/31 14:24

http://qiita.com/itkr/items/513318a9b5b92bd56185
を見ながら勉強しています。

取得したタグの情報のところ書いてある

取得したタグの属性を取得するには
soup.a.get("href")
取得したタグの中の文字を取得するには
soup.a.string
当然入れ子になっているタグを取得することもできます
soup.p.find_all("a")

のaとかpが何をあわらしているのか分かりません。

取得したタグの属性を取得するには と書かれていて
aタグを指定しているように見えるのに、
href属性を取ってきています。

また、当然入れ子になっているタグを取得することもできます の
ところではpタグを指定しているように見えるのに、
aタグを取ってきています。

これはどういう意味なんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

このコメントでは↓のsoupを使った場合のイメージで解説しますね。

python

1from bs4 import BeautifulSoup 2html_data=""" 3<html><head></head> 4<body> 5 <a href="http://example.com">テスト1</a></br> 6 <p> 7 <a href="http://example.net">テスト2</a></br> 8 <a href="http://example.org">テスト3</a></br> 9 </p> 10</body>""" 11 12soup = BeautifulSoup(html_data, "lxml")

のaとかpが何をあわらしているのか分かりません。

aやpはタグを表しています。

この状態で
soup.a
とすると、soupの中で最初にaタグで囲まれた箇所が取得されます。つまり、
print soup.a を実行すると、
<a href="http://example.com">テスト1</a>
が出力されます。

同様に、
soup.p
とすると、soupの中で最初にpタグで囲まれた箇所が取得されます。つまり、
print soup.p を実行すると、

<p><a href="http://example.net">テスト2</a></br><a href="http://example.org">テスト3</a></br></p> が出力されます。

更なる例として、
soup.p.a
とすると、soupの中で最初にpタグで囲まれた箇所 の中で最初にaタグで囲まれた箇所が取得されます。つまり、
print soup.p.aを実行すると
<a href="http://example.net">テスト2</a>
が出力されます。

今の soup.p.a という書き方だとpタグで囲まれた箇所の中で""最初に""aタグで囲まれた箇所しか取得されないので、2番目以降を使いたい時にはfind_all関数を使用します。
soup.p.find_all("a")
とすると、pタグで囲まれた箇所 の中でaタグで囲まれた箇所を""全て""リスト型で取得します。
つまり、pタグで囲まれた箇所の中で2番目のaタグで囲まれた箇所を出力したい場合には
print soup.p.find_all("a")[1]
とすればよいのです。これを実行すると
<a href="http://example.org">テスト3</a>
が出力されます。

また、タグに対してstringを指定すると、そのタグで囲まれた文字列を取得します。
つまり、
print soup.a.string を実行すると、
テスト1
が出力されます。

以上です。
いかがでしょうか?

投稿2017/03/31 16:58

TakuyaKurakado

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず。この2つの書き方は一緒のことをやってます。どちらもそのHTMLの中の最初のaタグを取得します。

python

1soup.find("a") 2soup.a # find("a") を簡略化したのがこれ

find("a") で aタグを取得してそのaタグからhref属性を取得するのが下記の書き方です。

python

1soup.a.get("href") 2 3# <a href="/hoge">test</a> 4# こういうHTMLだったら、"/hoge"が取得できます。

soup.p.find_all("a") は find("p") で pタグを取得して そのpタグ内のaタグを全て取得する という書き方です。

python

1soup.p.find_all("a") 2 3# <p> 4# <a href="/hoge">test</a> # <- これが取得 5# <a href="/hoge2">test</a> # <- これが取得 6# </p> 7# こういうHTMLだったら、真ん中の2つのaタグが取得できます。

投稿2017/03/31 14:52

編集2017/03/31 14:55
tell_k

総合スコア2120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問