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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

Python 3.x

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

Q&A

解決済

2回答

2131閲覧

beautifulsoupによるyahooニュースの記事抽出

uppi

総合スコア6

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

Python 3.x

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

0グッド

1クリップ

投稿2020/06/06 23:24

前提・実現したいこと

YahooニュースのRSSから各記事のURLを取得し、順次アクセスする。
URL先のニュース記事をbeautifulsoupで取得

発生している問題・エラーメッセージ

長いので、出力結果の一部を抜粋しています。 少し説明させてください。 ここでお伝えしたいことは、developerツールできちんとpタグのclass属性が"sc-dVhcbM hFPXIO yjDirectSLinkTarget"の要素を抽出したつもりだったのですが、なぜか指定以外の要素も混ざっているように見えることです。中にはclass属性すらないものもあります。 <p class="advanced"><a href="https://news.yahoo.co.jp/search/advanced">条件指定</a></p> <p>現在<em>JavaScriptが無効</em>になっています。Yahoo!ニュースのすべての機能を利用するためには、JavaScriptの設定を有 効にしてください。<br/>JavaScriptの設定を変更する方法は<a href="https://www.yahoo-help.jp/app/noscript">こちら</a>。</p> <p>お使いのInternet Explorerは古いバージョンのため、正しく表示されない可能性があります。最新のバージョンにアップデー トするか、別のブラウザーからご利用ください。<br/> <a href="https://about.yahoo.co.jp/info/msiesp/">Internet Explorerのアップデートについて</a> </p> <p class="source">6/4(木) 10:50配信 </p> <p class="ynCobrandBanner"><a href="https://rdsig.yahoo.co.jp/media/news/cobrand/bbcv/RV=1/RE=1592693958/RH=cmRzaWcueWFob28uY28uanA-/RB=/RU=aHR0cHM6Ly93d3cuYmJjLmNvbS9qYXBhbmVzZQ--/RS=^ADALFEpZ0qxbM3G5RmDIZMWwyCeq.s-"><img alt="BBC News" height="40" src="https://s.yimg.jp/images/news/cobranding/bbcv.png" width="170"/></a></p> <p class="cap">(c) BBC News</p> <p class="ynDetailText yjDirectSLinkTarget"> 「ジョージ・フロイドさんを大事にすべきだが、問題は400年前から続いている」<br/> <br/> 黒人男性ジョージ・フロイドさんが白人警官の暴行で死亡したことに全米各地で抗議が相次ぐなか、アフリカ系アメリカ人の暮ら しを映画で描き続けてきたスパイク・リー監督が、差別と格差の問題の大きさについてBBCに話した。<br/> <br/> リー監督は、動画配信大手ネットフリックスで公開する新作映画「Da 5 Bloods」についてBBCに語る中で、アメリカの人種対立は 「新しいことじゃない。もう400年も続いてきた」と述べた。<br/> <br/> 「それにアメリカだけのことでもない。アメリカは人種差別が得意だが、人種差別は世界中にある。人種差別がコロナウイルスよ り先の、世界的パンデミックだ」と、監督はBBCのウィル・ゴンバーツ芸能担当編集長に話した。<br/> <br/> 新作「Da 5 Blood」は、アフリカ系アメリカ人の退役軍人5人を描いた作品という。<br/> <br/> リー監督は、ニューヨーク・ブルックリンを舞台に人種の共存と対立、差別される側の抵抗と暴力などを描いた映画「ドゥ・ザ・ ライト・シング」(1989年)で米アカデミー賞の脚本賞候補になり、白人至上主義団体「クークラックスクラン(KKK)」を捜査し た黒人刑事を描いた「ブラック・クランズマン」(2019年)で同賞を受賞した。<br/> <br/> (英語記事 George Floyd death: Spike Lee says protesters were 'not just born angry')</p> <p class="ynDetailAuthor">(c) BBC News</p> <p class="ynCpName"> <span class="date">最終更新:6/4(木) 10:50</span><br/> <a href="https://news.yahoo.co.jp/media/bbcv" onmousedown="this.href='https://rdsig.yahoo.co.jp/media/news/medianame/articles/RV=1/RU=aHR0cHM6Ly9uZXdzLnlhaG9vLmNvLmpwL21lZGlhL2JiY3Y-'" style="font-size: 92%;">BBC News</a> </p> <p>読み込み中…</p> <p class="source"><span>シネマトゥデイ</span><span class="separate">6/4(木) 18:32</span></p> <p class="source"><span>時事通信</span><span class="separate">6/7(日) 7:51</span></p> <p class="source"><span>映画.com</span><span class="separate">6/4(木) 13:00</span></p> <p class="source"><span>SOCCER KING</span><span class="separate">6/3(水) 12:39</span></p> <p class="source"><span>CNN.co.jp</span><span class="separate">6/4(木) 13:17</span></p> <p class="source"><span>ぴあ</span><span class="separate">6/5(金) 11:31</span></p> <p class="source"><span>motorsport.com 日本版</span><span class="separate">6/3(水) 12:00</span></p> <p class="source"><span>ハフポスト日本版</span><span class="separate">6/5(金) 10:36</span></p> <p class="source"><span>Hint-Pot</span><span class="separate">6/4(木) 8:11</span></p> <p class="source"><span>コスモポリタン</span><span class="separate">6/4(木) 21:06</span></p> <p class="source"><span>ハーパーズ バザー・オンライン</span><span class="separate">6/3(水) 19:20</span></p> <p class="source"><span>FNNプライムオンライン</span><span class="separate">6/1(月) 17:30</span></p> <p class="source"><span>デイリースポーツ</span><span class="separate">6/3(水) 10:31</span></p> <p class="source"><span>ハフポスト日本版</span><span class="separate">5/31(日) 17:02</span></p> <p class="source"><span>BARKS</span><span class="separate">6/5(金) 10:14</span></p> <p class="source"><span>女子SPA!</span><span class="separate">6/4(木) 8:45</span></p> <p class="source"><span>バスケット・カウント</span><span class="separate">6/1(月) 18:05</span></p> <p class="source"><span>CINEMORE</span><span class="separate">6/3(水) 10:37</span></p> <p class="source"><span>ロイター</span><span class="separate">6/4(木) 13:00</span></p> <p class="source"><span>Movie Walker</span><span class="separate">6/6(土) 17:30</span></p> <p class="source"><span>BARKS</span><span class="separate">6/1(月) 16:33</span></p> <p class="source"><span>ABEMA TIMES</span><span class="separate">6/2(火) 13:16</span></p> <p class="source"><span>VOGUE JAPAN</span><span class="separate">6/2(火) 20:53</span></p> <p class="source"><span>cinemacafe.net</span><span class="separate">6/5(金) 14:30</span></p> <p class="source"><span>Game Spark</span><span class="separate">6/1(月) 10:57</span></p> <p class="source"><span>ABEMA TIMES</span><span class="separate">6/5(金) 12:57</span></p> <p class="source"><span>日刊スポーツ</span><span class="separate">6/4(木) 11:05</span></p> <p class="source"><span>IGN JAPAN</span><span class="separate">6/3(水) 12:06</span></p> <p class="source"><span>映画.com</span><span class="separate">6/4(木) 8:00</span></p> <p class="source"><span>シネマトゥデイ</span><span class="separate">6/5(金) 16:10</span></p> <p class="pointInfo"> <span class="pointInfo_paypay">PayPay残高</span><span class="pointInfo_tPoint"></span><span class="pointInfo_text">使 えます</span> </p> <p class="price">税込<em>55</em>円</p> <p class="price">税込<em>330</em>円</p> <p class="price">税込<em>55</em>円</p> <p class="price">税込<em>99</em>円</p> <p class="price">税込<em>55</em>円</p> <p><a class="goTopSide btnView" href="#" id="pageTopButton"><span>ページ上部に戻る</span></a></p> <p><em>アプリ</em><span>データ先読みで、電車でもサクサク</span></p> <p><em>Facebook</em><span>編集部による厳選記事を毎日配信</span></p> <p><em>Twitter</em><span>リアルタイムでニュースを配信</span></p> <p><em>news HACK</em><span>Yahoo!ニュースのオウンドメディア</span></p>

該当のソースコード

python

1import feedparser 2from bs4 import BeautifulSoup 3import pprint 4import requests 5 6RSS_URL = 'https://headlines.yahoo.co.jp/rss/bbc-c_int.xml' 7 8RSS = feedparser.parse(RSS_URL) 9link_list = [] 10for entry in RSS.entries: 11 link_list.append(entry.link) 12 13for link in link_list: 14 xml_doc = requests.get(link) 15 soup = BeautifulSoup(xml_doc.text, 'html.parser') 16 17 for script in soup.select("p", class_="sc-dVhcbM hFPXIO yjDirectSLinkTarget"): 18 pprint.pprint(script)

試したこと

findメソッドをselectメソッドの代わりに使用
17-18行目を変更しました。
script = soup.find('p', class_='sc-dVhcbM hFPXIO yjDirectSLinkTarget'
pprint.pprint(script)
結果
None

補足情報(FW/ツールのバージョンなど)

OS: windows10
editor: visual studio code
Python: 3.8.3 64bit

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

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

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

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

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

guest

回答2

0

投稿者様から投稿がありましたが、一応投稿させていただきます。


Python

1#省略 2for link in link_list: 3 xml_doc = requests.get(link) 4 soup = BeautifulSoup(xml_doc.text, 'html.parser') 5 6 pprint.pprint(soup.find("p",class_="sc-dVhcbM hFPXIO yjDirectSLinkTarget"))

これでどうでしょうか?
省略部分以外は動作チェックしています。

投稿2020/06/07 00:00

編集2020/06/07 07:13
glyzinieh

総合スコア222

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

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

uppi

2020/06/07 00:24

ご指摘の通り、selectメソッドを書き直し、実行しましたが、今度は何も表示されず、終了してしまいました。
glyzinieh

2020/06/07 01:05

なんとなくですが、 soup = BeautifulSoup(xml_doc.text, 'html.parser') が、違う気がします。 soupに代入されているデータを提示していただけませんか?
uppi

2020/06/07 02:21 編集

やってみましたが、あまりにも文字数が多すぎてteratail上に添付できませんでした。 なので、スクレイピングをしたいwebサイトのURLを代わりに置きます。ブラウザのdeveloperツールで見ていただければ、確認できるかと思います。一応、soupに代入されているものも同じだと確認できております。 お手数ですがよろしくお願いします。 https://news.yahoo.co.jp/articles/f5c40db27bfde5735d0d0f245fa8c40562c1009e
glyzinieh

2020/06/07 02:26

ありがとうございます。確認してみます。
glyzinieh

2020/06/07 02:36

soup = BeautifulSoup(xml_doc.text, 'html.parser') を soup = BeautifulSoup(xml_doc, 'html.parser') に変えてみてください。上手くいけば回答に追記します。
uppi

2020/06/07 02:41

教えていただいた通り、.textを除いて再実行してみましたが、下記のエラーが発生しました。 Traceback (most recent call last): File "c:\Users\lifeg\Documents\python_prg\beautifulsoup\feedparser1.py", line 15, in <module> soup = BeautifulSoup(xml_doc, 'html.parser') File "C:\Py\Python38\lib\site-packages\bs4\__init__.py", line 307, in __init__ elif len(markup) <= 256 and ( TypeError: object of type 'Response' has no len()
glyzinieh

2020/06/07 04:02 編集

soupは、HTMLデータですか?
uppi

2020/06/07 05:11

<!DOCTYPE html>から始まっているのでHTMLデータだと思います。 HTMLを書いたことはないのですが、、
glyzinieh

2020/06/13 00:34 編集

申し訳ありませんが、先ほど変えていただいた soup = BeautifulSoup(xml_doc.text, 'html.parser') を soup = BeautifulSoup(xml_doc.text) にしていただいて、警告が出た場合それにしたがってパーサーを指定してください。
uppi

2020/06/07 06:05

GuessedAtParserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. To get rid of this warning, pass the additional argument 'features="html.parser"' to the BeautifulSoup constructor. このようなエラーではなく警告が出ました。要約すると、このままでも大丈夫だが、念のためparserを明示しろとのことだと思います。 したがって、 soup = BeautifulSoup(xml_doc.text, features="html.parser") 上記のようにしましたが、結果は同じでした。
guest

0

自己解決

当初よりは改善できたので、報告します。
Yahooニュースの記事をスクレイピングしたかったのですが、余分な要素も入っていたので、排除したかったのですが、id属性のついているarticle要素をまず抽出し、そこからさらに、あるclass属性を持つp要素を抽出するようにしたら割と上手くいきました。
これまで助言してくださった方々には感謝しています。
ありがとうございました。
下記に改善後のコードを載せます。

python

1import feedparser 2from bs4 import BeautifulSoup 3import requests 4import lxml 5 6RSS_URL = 'https://headlines.yahoo.co.jp/rss/bbc-c_int.xml' 7 8RSS = feedparser.parse(RSS_URL) 9link_list = [] 10for entry in RSS.entries: 11 link_list.append(entry.link) 12 13for link in link_list: 14 xml_doc = requests.get(link) 15 soup = BeautifulSoup(xml_doc.text, 'lxml') 16 17 for article in soup.select("article", id = "uamods"): 18 for script in article.select("p", class_ = "ynDetailText yjDirectSLinkTarget"): 19 20 print(script.getText())

投稿2020/06/07 07:00

uppi

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問