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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
TBWに達したらTBWに達したことが通知されるのでしょうか?
その他(コンピューター・テクノロジー)
-
Class ってぱいそんでならったけど使いますか?なんか習う割にはあんまり覚えてないし見ない気がする
Perl
-
WindowsのCapsLock(キャップスロック)って、何の意味があるんですか?
C言語・C++・C#
-
-
4
double型が正常に認識されていない恐れ
C言語・C++・C#
-
5
テザリングで、パソコンの、windows updateできますか?windows11です。
Windows 10
-
6
擬似コード
C言語・C++・C#
-
7
サブルーチンを使った再帰的なプログラム
C言語・C++・C#
-
8
擬似コード
C言語・C++・C#
-
9
このキーボードを買ったのですがAmazonにはWindows11対応と書いてあるのに届いた商品の箱に
その他(コンピューター・テクノロジー)
-
10
Excelで数直線の作り方
Excel(エクセル)
-
11
会社のパソコンフォルダを漁っていたら今年度行われる昇進試験(係長)の問題を発見してしまいました。流石
その他(セキュリティ)
-
12
PythonのTkinter詳しい方へ。画像や言葉の意味を答える3択クイズを作るのに手間取っています
その他(プログラミング・Web制作)
-
13
私は買って早々、ノートパソコンに深刻なダメージを与えたという事なのでしょうか?( ˃ ⌑ ˂ഃ )
その他(コンピューター・テクノロジー)
-
14
大学のプログラミングの授業で課題としてProcessingでアニメーションを作らなければならないです
その他(プログラミング・Web制作)
-
15
CやJAVa,Rubyなどプログラミング言語の分岐のコードを思いつく限り教えてください。 if(◯
その他(プログラミング・Web制作)
-
16
reuterのScraypingで不思議な現象 hでは見出し出てこずaでは出てくる
HTML・CSS
-
17
擬似コード 長さがmの配列でなんで For i =0 to m とかかくの?m-1までしかないでしょ
C言語・C++・C#
-
18
パイソン。If elseの挙動について教えてください。パソコンは、if else で、まずifに当て
C言語・C++・C#
-
19
大抵のアプリが32bitバージョンなのは何故ですか?64bitのパソコンでも正常に動作しますか?
フリーソフト
-
20
パソコンのキーボードのF1~F12に絵が書いてある場合って以下の2通りがありますが、私のノートパソコ
その他(コンピューター・テクノロジー)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSFタグのfタグとは
-
reuterの記事をbeautiful.soup....
-
phpループ リスト一覧
-
VBAのコマンドボタンの文字列の...
-
エクセルVBA 文字列領域が不足...
-
COBOLの改行
-
全角括弧と全角読点の間隔を狭...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
文字の入力で横バー上段、中断...
-
preg_matchでエラーが出ます。
-
ラベル(スタティックテキスト)...
-
グレープシティのSPREAD...
-
マクロで半角を全角に
-
【VBA】エクセルで最後の不要な...
-
テキストファイルから改行コー...
-
C++でのCRLFについて
-
文の改行
-
メッセージボックスで1025文字...
-
最終行の改行について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[php][正規表現]タグ以外を削除...
-
正規表現で複数行に渡る範囲を...
-
変数にHTMLを代入する場合
-
phpの正規表現でstyle="●●"を削...
-
正規表現でタグの置換をしたい...
-
タグにはさまれている文字以外...
-
コメントタグに挟まれた部分を...
-
Nvuで作成したhtmlをコピペして...
-
htmlのソースからテーブルの値...
-
htmlタグ間の特定文字置換
-
スクレイピングの仕方
-
Java正規表現-"ある文字列"を含...
-
JSFタグのfタグとは
-
タグとクッキーって関係あるん...
-
eclipseより、タスク・タグの使...
-
PHP 取得した経過時間の表示に...
-
htmlソースの中を検索して、
-
srcに「banner.」で始まるファ...
-
アフィリエイトタグについて質...
-
アクセス解析データがでません...
おすすめ情報
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"})