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

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

ただいまの
回答率

88.34%

BeautifulSoupで複数条件を指定する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,686

YOSHITAKEH

score 21

※Pythonの初心者で、ウェブスクレイピングの勉強中に起きた問題です。質問情報の不足がございましたら、ご教授くださいませ。

 前提・実現したいこと

特定のURLのウェブスクレイピングの際に、複数条件を指定して、1行にまとめたいです。

URL:https://nekochan.jp/cat/category/i-want-a-cat

<div class="post_loop">
<div class="post_loop_item ">
                    <a href="https://nekochan.jp/cat/article/5459">
                        <figure>
                            <img src="https://cdn.wanchan.jp/c/nekochan.jp/pro/crop/120x120/center/2/eed8f70e8012c6b87d44418302f9dcb8.jpg" alt="一人暮らしでも飼いやすい猫の種類8つ、飼う前に確認する事">
                        </figure>
                        <div class="post_loop_info">
                            <div class="post_title">
                                一人暮らしでも飼いやすい猫の種類8つ、飼う前に確認する事                            </div>
                            <div class="bottom">
                                <p class="post_pre_title">一人暮らしで猫を飼おうかと、悩んでいる人におすすめな猫の種類を紹介します。一人暮らしで猫を飼うにはそれなりの覚悟も必要になってきます。飼う前に必要な事は、猫の種類だけで…</p>
                                <div class="view">217 view</div>
                                <div class="writer">JIN</div>
                            </div>
                        </div>
                    </a>
                </div>
<div class="post_loop_item ">
<div class="post_loop_item ">
<div class="post_loop_item ">
<div class="post_loop_item ">

 希望する出力結果

このHTMLソースファイルの、"post_title"と"URL"と"VIEW"だけを抜き取って、リスト化したいです。
記事1〜3があるとしたら、

1.post_title:url:view数
2.post_title:url:view数
3.post_title:url:view数

のようなリストが作りたいです。最終的にはCSVファイルで保存したいです。

(記事1の例)
一人暮らしでも飼いやすい猫の種類8つ、飼う前に確認する事:https://nekochan.jp/cat/article/5459:217

 問題点

1.無駄な空白が出てきてしまう(出力結果の記事タイトルの前後)ので、削除したい
2.authorなど不要な条件を指定する方法が分からない
3.print()ではなくて、CSVに保存する方法がわかりません。

何卒、宜しくお願いいたします。

 該当のソースコード

import requests
from bs4 import BeautifulSoup

r = requests.get("https://nekochan.jp/cat/category/i-want-a-cat")


links = soup.find(class_="post_loop").find_all('a')
for link in links:
    if 'href' in link.attrs:
        print(link.text,':',link.attrs['href'])

 出力結果

※最初の一行だけ抜粋しています。

一人暮らしでも飼いやすい猫の種類8つ、飼う前に確認する事                            

一人暮らしで猫を飼おうかと、悩んでいる人におすすめな猫の種類を紹介します。一人暮らしで猫を飼うにはそれなりの覚悟も必要になってきます。飼う前に必要な事は、猫の種類だけで…
69 view
JIN


 : https://nekochan.jp/cat/article/5459
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

こんにちは。

以下のようにやってみました。

  • Pythonのソースコード内では print() を使い、実行時にファイルにリダイレクトすることでCSVファイルを作成

  • スクリプトの作成中、頻繁に対象サイトにアクセスしないよう、解析対象のページをダウンロードして、index.html というHTMLファイルに保存してこれを解析対象とする。

以下はスクリプトの内容と実行ログです。

(teratail) [jun68ykt@macmini q150619]$ date
2018年 10月 7日 日曜日 23時02分55秒 JST
(teratail) [jun68ykt@macmini q150619]$ python -V
Python 3.7.0
(teratail) [jun68ykt@macmini q150619]$ head index.html

<!doctype html>
<html><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>猫を飼う準備のまとめ</title>

<link rel="canonical" href="https://nekochan.jp/cat/category/i-want-a-cat">

<link rel="next" href="https://nekochan.jp/cat/category/i-want-a-cat?rows=2" />
<meta name="description" content="猫を飼うときに準備しておきたいものや、猫を迎え入れる先など、非常に悩まれるかと思います。そもそもどうやって猫を飼えばいいのか、猫を飼うには何が必要なのか、猫を飼うということはどういうことなのかなど、何もわからない方も多いかと思います。このページでは、猫を飼う前に準備したいものや、猫の選び方、猫のお迎え先(ペットショップや里親などの選択肢)などの情報まとまっていますのでぜひ参考にしてみてください。">

(teratail) [jun68ykt@macmini q150619]$ cat scraping.py 

from bs4 import BeautifulSoup

path = './index.html'

with open(path) as f:
    soup = BeautifulSoup(f.read(), 'html.parser')
    links = soup.find(class_='post_loop').find_all('a')
    for link in links:
        if 'href' in link.attrs:
            title = link.find(class_='post_title').find(text=True).strip()
            view = link.find(class_='view').find(text=True).strip().split()[0]
            print(','.join([title, link['href'], view]))

(teratail) [jun68ykt@macmini q150619]$ python scraping.py > data.csv
(teratail) [jun68ykt@macmini q150619]$ cat data.csv

一人暮らしでも飼いやすい猫の種類8つ、飼う前に確認する事,https://nekochan.jp/cat/article/5459,309
うっとりしてる?猫がリラックスできる音楽を検証してみました,https://nekochan.jp/cat/article/5424,726
3か月の猫の大きさや育て方、おすすめ商品,https://nekochan.jp/cat/article/5396,868
焼けるようなコンクリートの上でアリがたかり命の危機だった子…,https://nekochan.jp/cat/article/5421,4665
ノラ猫を拾ったら?飼い方や注意する事,https://nekochan.jp/cat/article/5433,1006
猫のためにはフローリングとカーペットどちらがいい?,https://nekochan.jp/cat/article/3965,1598
猫を飼う前と飼った後で変わった『5つ』の事,https://nekochan.jp/cat/article/3783,3191
犬がいるお家で猫をお迎えする時の3つのチェックポイント,https://nekochan.jp/cat/article/5118,1178
猫の出産ラッシュ…自分でお世話できないのであれば拾わないで!,https://nekochan.jp/cat/article/5268,24116
室内飼いしている猫同士でも縄張りはある?一緒に暮らす時注意…,https://nekochan.jp/cat/article/4551,1263
猫の室内飼いはストレスを感じる?快適に暮らせるための4つの…,https://nekochan.jp/cat/article/5219,2894
好きな食べ物から猫の『名前』を付けてみよう!,https://nekochan.jp/cat/article/4946,1307
人を信用しない猫にはどう接してあげるべき?,https://nekochan.jp/cat/article/5209,2430
保護猫のトライアル期間チェックしたい4つのこと,https://nekochan.jp/cat/article/5166,1365
子猫を助けて愛護管理センターに連れて行ったら殺処分の危機?!,https://nekochan.jp/cat/article/5095,3126

(teratail) [jun68ykt@macmini q150619]$

以上、参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/07 23:23

    jun68yktさま、ご回答ありがとうございました。早速、実行して、無事に解決できました。本当にありがとうございました。

    キャンセル

  • 2018/10/08 05:21

    解決されたとのことで、よかったです!

    キャンセル

0

import csv
import requests
from bs4 import BeautifulSoup

url = 'https://nekochan.jp/cat/category/i-want-a-cat'

r = requests.get(url)

if r.status_code == requests.codes.ok:

    soup = BeautifulSoup(r.content, 'html.parser')

    with open('result.csv', 'w') as fw:

        writer = csv.writer(fw, dialect='excel', lineterminator='\n')

        for items in soup.select('div.post_loop_item > a'):

            link = items.get('href')
            title = items.select_one('div.post_title').get_text(strip=True)
            view, _ = items.select_one('div.view').get_text(strip=True).split()

            writer.writerow([title, link, view])
  1. 無駄な空白が出てきてしまう(出力結果の記事タイトルの前後)ので、削除したい
    .get_text(strip=True)で前後の空白文字を除去できます

2.authorなど不要な条件を指定する方法が分からない
必要なところだけ選べばいいので不要なところは選ばなければいいだけなのでは

3.print()ではなくて、CSVに保存する方法がわかりません。 
https://docs.python.org/ja/3/library/csv.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/08 23:54

    ご回答ありがとうございます。
    1.のご回答の通りにやって前後の空白文字が消えました。大変助かりました。また質問させていただくことがあるかと思いますが、宜しくお願いいたします。

    キャンセル

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る