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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Beautiful Soup

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Q&A

解決済

1回答

2828閲覧

特定のキーワードが入ったニュース記事をスクレイピングして保存したい

TakayukiOta

総合スコア15

Beautiful Soup

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

0グッド

1クリップ

投稿2020/06/25 15:08

編集2020/06/26 08:36

新聞社のウェブサイトから特定のキーワード(e.g.生活習慣病)が入った記事を抜き出して保存したいです。newspaper3kというライブラリを試してみましたが、キーワードを指定しても関係のない記事のリンクが保存されてしまいます。以下が試してみたコードです。

python

1pip install newspaper3k 2import newspaper 3from newspaper import Article 4# news pages which include keyword "生活習慣病" 5url = "https://r.nikkei.com/search?keyword=生活習慣病&volume=10" 6website = newspaper.build(url, memorize_articles = False, MAX_SUMMARY = 300) 7for article in website.articles: 8 print(article.url) 9 print(article.title)

output
https://r.nikkei.com/article/DGXLSSXK50451_W0A620C2000000
None
https://r.nikkei.com/article/DGXMZO60842740W0A620C2X30000
None

urlに指定したリンク(https://r.nikkei.com/search?keyword=生活習慣病&volume=10)では生活習慣病というキーワードを含む記事が一覧で表示されるのですが、その一つ一つをforループで取得しようとすると、全く違う記事のリンクになってしまいます。urlの指定の仕方が間違っているのでしょうか?
よろしくお願いします。

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

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

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

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

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

Penpen7

2020/06/25 19:15

ソースコードを載せて、そのコードでどういう問題があるのか書いてください。
TakayukiOta

2020/06/26 08:37

ソースコードを追記しました。よろしくお願いします。
Penpen7

2020/06/26 09:00

mac, python3.6.3, newspaper3k0.2.8でコードを実行したところ、 https://www.nikkei.com/news/category 速報 https://www.nikkei.com/news/jinji 人事 https://www.nikkei.com/news/okuyami おくやみ https://www.nikkei.com/article/DGXMZO60618910S0A620C2K14500 「社員ファースト企業」伸びる やる気も時価総額もUP https://style.nikkei.com/article/DGXMZO60296890S0A610C2NZGP01 病気からどうやって体を守るの? 「免疫」の仕組み https://style.nikkei.com/article/DGXMZO60320160S0A610C2000000 最新栄養指針で見えた 日本人の食事に足りないもの https://www.nikkei.com/article/DGXMZO60513230Y0A610C2000000 銀座で飲める漢方ドリンク 健康志向で畑を応援 https://www.nikkei.com/article/DGXMZO60201120Q0A610C2L83000 東京都医師会、乳幼児の予防接種呼びかけ 第2波に備え https://style.nikkei.com/article/DGXMZO59925680T00C20A6W01001 自宅に眠るグッズでコロナ太り解消 トレーニング10選 https://style.nikkei.com/article/DGXMZO59877900S0A600C2000000 「血管年齢」ってよく聞くけど… どうすれば分かる? https://www.nikkei.com/article/DGXMZO59758910Z20C20A5I00000 コロナウイルス、子どもへの影響は? https://www.nikkei.com/article/DGXMZO60052860V00C20A6L61000 浜松市、杏林堂などと減塩レシピ https://www.nikkei.com/article/DGXMZO59965290U0A600C2LKA000 京大発のiPSベンチャー、富士フイルムなどから3億円調達 https://www.nikkei.com/article/DGXMZO60835900W0A620C2MM8000 None https://www.nikkei.com/article/DGXMZO60770260V20C20A6I00000 None https://www.nikkei.com/article/DGXMZO60830040W0A620C2L91000 None https://www.nikkei.com/article/DGXMZO60835120W0A620C2000000 None https://www.nikkei.com/article/DGXMZO60827360W0A620C2000000 None https://www.nikkei.com/article/DGXMZO60836380W0A620C2CR8000 None 生活習慣病に関しての内容は取れているように思えます。 関係ないものは同ページに広告とかがあるのでそれも拾っているかもしれません。
Penpen7

2020/06/26 09:13

何度かやると拾えたり拾えなかったり不安定ですね どの新聞社に対応しているか見つかりませんでした。 検索結果だけはBeautifulSoupでやったほうが早くて確実かもしれません。
guest

回答1

0

ベストアンサー

BeautifulSoupで検索結果を取るプログラムを書きました。
実行は自己責任でお願いします。

python

1import requests as re 2from bs4 import BeautifulSoup 3import time 4 5# 連続アクセス防止 6time.sleep(5) 7print('start') 8 9# ダウンロード 10url=re.get('https://r.nikkei.com/search?keyword=%E7%94%9F%E6%B4%BB%E7%BF%92%E6%85%A3%E7%97%85&volume=300') 11 12# BeautifulSoupに渡す 13soup = BeautifulSoup(url.content, "html.parser") 14 15# divのsearch__result-itemクラスだけを抽出 16elem = soup.findAll('div', class_='search__result-item') 17 18# 何件ヒットしたか取得し, 整数型に変える 19count = int(soup.find('p', class_='search__result-count').text.replace(',','')) 20print(count, "件ヒット") 21 22for i in elem: 23 # 記事へのリンクを取ってくる 24 link = i.find('a') 25 26 # a要素のtextを取得 27 print(link.text.strip()) 28 29 # 記事のURLを取得 30 print(link['href']) 31 32 # 記事の日付を取得 33 print(i.find('time').text) 34 # 色々調整 35 discription = i.find('a', class_='nui-card__excerpt').text.strip() 36 lines= [line.strip().strip('...') for line in discription.splitlines()] 37 discription = ''.join(lines) 38 print(discription) 39 40 print('')

投稿2020/06/26 10:31

編集2020/06/26 12:07
Penpen7

総合スコア698

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問