
pythonで記事の切り抜きを作っています。
BS4で、tagの属性ではない部分での検索方法は、どうしたらよいのでしょう?
reuterは、htmlでは、記事の題名が下記の形式になっています。
<a data-testid="Heading" href="***>記事題名</a>
a tag に続く data-testid="Heading" 利用したいが方法が解りません。
正規表現 <a data-testid="Heading".*?</a>
editor検索では、aタグ部分となるのでsoupでためしてみたけど、
エラーにならないが、結果は ゼロ。
soup.find_all(re.compile('<a data-testid="Heading".*?</a>'))
No.1ベストアンサー
- 回答日時:
soup.find_all(re.compile(~~~)) は、「タグ名」が指定した正規表現にマッチするかどうかです。
タグ名以外は無関係。def f(tag):
return tag.attrs.get("data-testid")=="Heading"
soup.find_all(f)
か、同じ事をlambdaで書いて、
soup.find_all(lambda tag: tag.attrs.get("data-testid")=="Heading")
か、
soup.select("a[data-testid='Heading']")
findやfind_allは、引数が独特で機能も少ないのに対して、select_one や selectは引数にCSSセレクターを書けるので、よく使われます。
まあ、find系も上記のように関数を引数にすれば細かく指定は出来ますが。
ご教示に感謝。解決しました。
私のスキルでは、
def f(tag):
return tag.attrs.get("data-testid")=="Heading"
soup.find_all(f)
が理解できず、いろいろ探したら 属性指定する方法があるようで、
soup.find_all(attrs={"data-testid":"Heading"})
として、貴兄推奨と同じ結果を得ることができました。
これなら、私にも理解できそう。
また、この属性は a tag だけでなく h tag などにも使われていて、
初めに
soup.find_all("a", attrs={"data-testid":"Heading"})
だと、件数がごく少なかったので気が付いて、属性だけ指定の必要性に気が付きました。
HTMLのtagとその属性(attribute)や利用法を初めて意識するようになりました。
また、a tagを指定すると、下記でも機能することが解りました
soup.find_all("a", "data-testid"=="Heading")
この関係の解説では、例えば
https://ai-inter1.com/beautifulsoup_1/#st-toc-h-18
find_all: attrs引数
属性を辞書にして引数 attrs として値を渡しても、属性で検索することができます。辞書にはキーとして属性を、値として属性値を設定します。
例えば、以下のコードでは、辞書でid属性、属性値”link2”を渡しています。
soup.find_all(attrs={"id": "link2"})
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- Visual Basic(VBA) マクロ 関数を使った抽出でエラーになってしまう 1 2022/02/01 14:44
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- SEO サイトがいつまでたってもGoogleのインデックスの圏外 3 2021/12/19 23:11
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- 弁護士・行政書士・司法書士・社会保険労務士 法定相続分による単独申請(相続登記) 2 2021/11/24 08:36
- Visual Basic(VBA) Excelでセル内の一部のみ同じセルを検索し、そのセルと同じ行で任意の列のセルを選択する方法 2 2021/12/17 11:01
- その他(ブログ) ブログをバズらせる方法を教えてください 5 2023/10/27 12:22
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- gooブログ ブログ投稿時にタグ名を入力しているので、ブログ画面でタグ名で検索できませんか? 2 2023/09/03 14:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行結果で画像が出力されない...
-
とても初歩的な質問で申し訳な...
-
携帯用HPの作成で
-
正規表現の否定先読みについて
-
htmlソースの中を検索して、
-
VBAでhtmの全てのタグの名前・...
-
PHPでHTMLの中から <div>~</di...
-
PHP Webページのタイトルを取得...
-
指定したURIを参照して、ソース...
-
csobjというタグについて
-
【PHP】 タグを有効にするには?
-
PHP テキストファイルの一部分...
-
PHPの正規表現について質問致し...
-
Nvuで作成したhtmlをコピペして...
-
こんにちは。PHPとMySQLで自作...
-
リッチテキストエディターでの...
-
WEB制作未経験・個人ですが、サ...
-
preg_replace()でマッチ文字列...
-
追伸します。
-
phpで文字列の一部を基準にして...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseより、タスク・タグの使...
-
echoで画像を呼び出すことがで...
-
Nvuで作成したhtmlをコピペして...
-
PHPでのページ表示について
-
(コード付きです)文章の中か...
-
タグ
-
URLの連続アクセス
-
XSSで、<a><pre>タグだけを有効...
-
J-SH09 でのウェブ表示
-
ペナルティーについて
-
htmlのソースからテーブルの値...
-
クリッカブルマップはネスケで...
-
[正規表現][入れ子]ネストされ...
-
あるタグから対応するタグまで...
-
preg_replace() で特定の文字の...
-
強制ジャンプを中止したいです。
-
phpの定義済み関数
-
タグにはさまれている文字以外...
-
cHTMLのタグはHDMLでは
-
自分でタグ打ちして作ったペー...
おすすめ情報
titles=soup.find_all("a") とすると、全ての a tagが抽出され、
for title in titles: #story-titleリストの要素
print(title.text.strip())
で、記事ヘッディングとそれ以外のもののテキストがあるものだけプリントできるが、
記事無関係が記事同数以上。
titles=soup.find_all("a",data-testid="Heading")
だと、エラー dの部分でメッセージ下記
expression cannot contain assignment, perhaps you meant "=="?
類似ケースで同じ構文は機能するの、未定義でも属性として認識するようだ。
で属性部分を1文字から一文字ずつ増やしてみたら
- が入るとエラーになった。禁止文字なのだろうか?
今回、いろいろやって気が付いたこと
html で tag と attrs で指定する場合は、
登録されている attrs の class(class_) や id などは クオーテーションで囲まず=で指定できる。
しかし、未登録の attrs の場合は、クオーテーションで囲んで == を使う。
attrs は辞書になっているので、辞書の指定方法の下記形式でも利用できる。
soup.find_all(attrs={"属性(Key)" : "属性内容(value)"})
また、 tag なしだと すべてのtagに適用される。
soup.find_all(attrs={"key":"value"})