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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
Pythonのスクレイピングの質問です。
その他(プログラミング・Web制作)
-
なぜサーバーの運用にはLinuxが必要なのですか?
サーバー
-
Pythonのre.split()の正規表現の使い方
その他(プログラミング・Web制作)
-
-
4
Class ってぱいそんでならったけど使いますか?なんか習う割にはあんまり覚えてないし見ない気がする
Perl
-
5
TBWに達したらTBWに達したことが通知されるのでしょうか?
その他(コンピューター・テクノロジー)
-
6
double型が正常に認識されていない恐れ
C言語・C++・C#
-
7
WindowsのCapsLock(キャップスロック)って、何の意味があるんですか?
C言語・C++・C#
-
8
Python超入門者です、win pcにv3.1インストールして入力してたった3行のコマンドを入力s
その他(プログラミング・Web制作)
-
9
10BASE-Tなどは何でしょうか
Windows 10
-
10
Fortran の定数表現について
その他(プログラミング・Web制作)
-
11
スコープ解決演算子を解読できるサイトを教えて!
その他(プログラミング・Web制作)
-
12
python の素朴な疑問
その他(プログラミング・Web制作)
-
13
デルの決算セールが昨日終わりましたが値下げはショボかったです。底値より5000円から1万円ほど高かっ
その他(コンピューター・テクノロジー)
-
14
ファイルのハッシュ値をパソコンを使わずスマホで知る方法を教えて下さい!
その他(コンピューター・テクノロジー)
-
15
MS-DOS 6.22のダウンロード
その他(OS)
-
16
プログラミングで詰まった時って皆さんどうしていますか?
その他(プログラミング・Web制作)
-
17
USBや外付けハードディスクをパソコンに繋いでいるとき、あるいはスマートフォンをケーブルを使って充電
その他(コンピューター・テクノロジー)
-
18
コマンドプロンプトについて。
C言語・C++・C#
-
19
良いプログラム、悪いプログラムの条件
その他(プログラミング・Web制作)
-
20
CGIの記述について教えてください…使用期限
CGI
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP4→5にアップグレードしたら...
-
変数にHTMLを代入する場合
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
文字の入力で横バー上段、中断...
-
JAVA System.out.println の ...
-
ソースコードの1行が長いとき...
-
jsp 改行コードで改行させて表...
-
LaTeX: captionの中で改行した...
-
全角括弧と全角読点の間隔を狭...
-
改行について
-
fgetws関数で読み込んだUNICODE...
-
emacsの自動改行+インデントに...
-
2バイトローマ数字小文字につ...
-
php 正規表現で、\\マークを取...
-
文字列の置換をCStringで(C++)
-
テキストボックス行の桁数を制...
-
phpでhtmlソースを解析し、文字...
-
RSSを取得すると文字化けする。
-
改行を読み飛ばす
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
reuterの記事をbeautiful.soup....
-
JSFタグのfタグとは
-
正規表現で複数行に渡る範囲を...
-
phpの正規表現でstyle="●●"を削...
-
変数にHTMLを代入する場合
-
Nvuで作成したhtmlをコピペして...
-
正規表現で指定範囲すべて除去...
-
正規表現でタグの置換をしたい...
-
Strutsでリンクを動的に生成したい
-
自分でタグ打ちして作ったペー...
-
php正規表現 相対パス→絶対パス
-
ASP.NET(C#)とhtmlの#include
-
PHPの正規表現でHTMLタグの内容...
-
csobjというタグについて
-
HTMLファイルの書き換え
-
VBSでのhtmlタグ要素名の置換
-
URLの連続アクセス
-
htmlタグ間の特定文字置換
-
javascriptの正規表現でhtmlか...
-
正規表現でHTMLタグの属性まで...
おすすめ情報
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"})