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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1240閲覧

Python3でBeautifulSoupを使用している際のfor文について理解ができません

faker

総合スコア51

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/12 16:53

編集2020/02/13 05:05

Python初心者なのでもしかしたらBeautiful Soup以前の問題だったら申し訳ないです。
Beautiful Soup 4のチュートリアル(http://kondou.com/BS4/)を順番にこなしていて、なぜこの記述でこのような処理になるのかが分からなくなり質問させていただきます。
該当のプログラムはこれです。

Python3

1from bs4 import NavigableString 2html_doc = """ 3<html><head><title>The Dormouse's story</title></head> 4 5<p class="title"><b>The Dormouse's story</b></p> 6 7<p class="story">Once upon a time there were three little sisters; and their names were 8<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, 9<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and 10<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; 11and they lived at the bottom of a well.</p> 12 13<p class="story">...</p> 14""" 15 16soup = BeautifulSoup(html_doc) 17 18 19def surrounded_by_strings(tag): # 兄弟要素で、next,previous両方の隣が文字列のときTrue 20 return (isinstance(tag.next_element, NavigableString) and isinstance(tag.previous_element, NavigableString)) #isinstalceは第一引数のオブジェクトが第二引数のtypeだったらTrue返すPythonの関数 21 22for tag in soup.find_all(surrounded_by_strings): #find_allは引数に渡したタグをすべて出力 23 print(tag) 24

私の解釈だと、find_allは引数に渡されたタグをすべて返してくれるものだと考えていました。
しかし、このプログラムだと、surrounded_by_strings関数の引数になにが渡されるのかが分からないです。また、この関数で返されるのは真偽値なはずなのにfind_all関数ができようされている意味がよくわからないです。
Pythonの理解ができてない可能性がおおいになるので、タイトルにBeautifulSoupと入れたのは間違いだったかもしれません、申し訳ないです。
足りない情報があれば指摘していただけると幸いです。よろしくお願いいたします。

--追記(2020/2/13)
ありがとうございます、surrounded_by_stringsの引数にはパースされたの要素を順番に挿入していることは理解できました。
つまり、find_all関数は文字列や正規表現を引数に渡せるし、「関数をfind_all関数の引数に渡すことで、その関数の引数にはパースされた要素が入るようになり」同様にfind_all関数の引数として渡すことができるということでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

ドキュメントを探して読みましょう。
参考: http://kondou.com/BS4/#find-all

name引数
フィルターの種類 で述べたように、 name 引数は文字列, 正規表現, リスト, 関数, True値をとることができます。

フィルターの種類
関数
以上のフィルターで機能が足りないときは、自分で引数に要素をとる関数を定義することもできます。 その関数は、引数がマッチしたときは True を、そうでないときは False を返します。

投稿2020/02/12 18:25

shiracamus

総合スコア5406

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

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

0

find_allは引数に渡された条件にあうタグをすべて返してくれますので

surrounded_by_strings関数でコメントにもあるように兄弟要素で、next,previous両方の隣が文字列のときTrueが返り

タグが返ってきます

surrounded_by_strings関数の引数になにが渡されるのかが分からないです

python

1print(tag)

まずはデバッグの仕方を覚えたほうがいいと思います
https://www.sejuku.net/blog/62791

vscode
https://www.atmarkit.co.jp/ait/articles/1806/05/news023.html

投稿2020/02/13 00:02

barobaro

総合スコア1286

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問