プロが教えるわが家の防犯対策術!

Win11でpython3.11をIDLEで利用しています。

requestsとbs4でScraypingを使い、
https://jp.reuters.com/ をScrayping

chromeのWebの検証では、下記のように記事のhがあるのに?
html
<h1 data-testid="Heading" ***>G7首脳、ガザ戦闘停止求める イランにも関与自制を要請</h1>

soup.find_all("h1") では、「上記のhタグ見出し」が抽出されず、分野名やAdだけ。
soup.find_all("a") では、a-tagの記事見出しが抽出できる。

こんなことって、あるのでしょうか?

質問者からの補足コメント

  • どう思う?

    教えてもらって確認したら、
    ソースhtmlと、画面に表示される記事の検証のhtmlが異なっていた。
    確かに記事はソースから作られた製造物になっている。
    selenium4+pythonで最も簡単なものを作ってみた
    driver.find_elements(By.TAG_NAME, 'h3')
    動作してh3タグでトップ画面の見出し39件取得できましたが、それ以外によけいな分類部分など50件近く。
    そこで、bs4のsoupのように
    a タグと 属性と属性値で制限することはできないのでしょうか?
    可能なら <a data-testid="Heading" 利用できる。

      補足日時:2023/12/09 04:59
  • HAPPY

    solenium4のscraypingでは、yuccoさんの解説サイトが役に立った
    https://note.com/yucco72/n/neef7e680786e#f0c0ba0 …

    取得した範囲をさらに絞り込める。
    find_element()の返りオブジェクトに対しfind_elements()が掛けられる。

    main_content = driver.find_element(by= By.TAG_NAME, value= "main")
    h3s = main_contents.find_element(by= By.TAG_NAME, value = "h3")
    これで36件のトップ記事の見出しが取れました

      補足日時:2023/12/09 07:39
  • うれしい

    先の補足でミス発見 正しいのはこちら
    main_content = driver.find_element(by= By.TAG_NAME, value= "main")
    h3s = main_content.find_elements(by= By.TAG_NAME, value = "h3")
    絞込するobjectは、listはだめで、ひとつだけ。
    絞り込んだ中から複数をlistに出すのはOK。
    soleniumは、bs4よりかなり時間がかかる。
    これなら、他のbs4で取れなかったサイトもできそう。

      補足日時:2023/12/09 07:56

A 回答 (1件)

> こんなことって、あるのでしょうか?


よくあることです。
requestsで取得するHTMLは、Chromeブラウザで見るには画面を右クリックして「ページのソースを表示」で表示される物と同一です。

ブラウザの検証(開発者ツール)で見られるのは、そのHTMLを取得後に、JavaScriptが動き出して、HTMLを書き換えた後の物です。これを得るためにはJavaScriptを実行する環境が必要です。

スクレイピングの方法として、大きく2通りあります。
・requestsを使いたい⇒ブラウザの開発者ツールじゃなくて「ソースを表示」を見る(そこにある物しか取得できない)
・ブラウザの開発者ツールにしか無いものを取得したい⇒requestsは使えないのでSelenium+ブラウザを使って、ブラウザにJavaScriptを実行してもらい、その結果を得る
    • good
    • 0
この回答へのお礼

教えてもらって確認したら、
ソースhtmlと、画面に表示される記事の検証のhtmlが異なっていた。
確かに記事はソースから作られた製造物になっている。
selenium4+pythonで最も簡単なものを作ってみた
driver.find_elements(By.TAG_NAME, 'h3')
動作してh3タグでトップ画面の見出し39件取得できましたが、それ以外によけいな分類部分など50件近く。
そこで、bs4のsoupのように
a タグと 属性と属性値で制限することはできないのでしょうか?
可能なら <a data-testid="Heading" 利用できる。

お礼日時:2023/12/09 05:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A