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

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

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

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

Beautiful Soup

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

Python 3.x

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

Q&A

解決済

1回答

5539閲覧

BeautifulSoupでスクレイピングし、サイトを前後比較する(差分のみ表示する方法)

saita

総合スコア14

スクレイピング

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

Beautiful Soup

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

Python 3.x

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

0グッド

0クリップ

投稿2019/02/04 14:22

pythonを使ってbeautifulsoupで取得した情報を比較したいと考えています。
例えば前日と当日の差分を取るなど。

まずスクレイピングした結果を丸ごとCSVに放り込んで保存しています。

f = open(filename, 'a',) CsvWriter = csv.writer(f) site=requests.get(URL,timeout=10,verify=False) soup=BeautifulSoup(site.content,'html.parser') CsvWriter.writerow([URL,soup]) f.close()

上で作った2つのcsvを比較します。
例えば次の2ファイルとした時
- /files/20190203.csv
- /files/20190204.csv

#!/usr/bin/env python # -*- coding: utf-8 -*- import difflib import sys import csv csv.field_size_limit(sys.maxsize) new_filepath = '/files/20190204.csv' old_filepath = '/files/20190203.csv' old_data = open(old_filepath, 'r',) old_reader = csv.reader(line.replace('\0','') for line in old_data) new_data = open(new_filepath, 'r',) new_reader = csv.reader(line.replace('\0','') for line in new_data) old_d=list() for row1 in old_reader: old_d.append(row1) new_d=list() for row2 in new_reader: new_d.append(row2) for i in range(0,d): if new_d[i][1] == old_d[i][1]: print("昨日と同じ") else:     print("昨日と違う") print(new_d[i][0]) #異なるURLのみ表示

以上は上手く動いて変更のあったURLのみ表示することができます。
しかし以下のように「変化のあった場所」をdiff取ろうとしましたが上手くいきません。

dd = difflib.ndiff(new_d[i][1], old_d[i][1]) for buf in dd:   print(buf)

結果としては、1文字ずつ比較されるようなOUTPUTになってしまいます。
色々試してみたのですが、difflibの使い方がよくないのかもしれません。
差分のある行のみ表示することはできないでしょうか?

実行結果の一部抜粋です。。

- < - / - s - p - a - n - > - - < - / - l - i - > - < - l - i - > - - < - a - - h - r - e - f - = - " - h - t - t - p - : - / - / - e - c - . - s - h - o - p - . - m - a - . - c - o - . - j - p - / - s - h - o - p - d - e - t - a - i - l - /

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

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

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

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

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

guest

回答1

0

ベストアンサー

python3

1dd = difflib.ndiff(old_d[0][1].split('\n'), new_d[0][1].split('\n')) 2for buf in dd: 3 if not buf.startswith(' '): 4 print(buf)

差分の部分です。なるべくいじらずに書き換えると、こんな感じだと思います。
saitaさんの比較している対象は、HTML全体を1つの文字列としたものだったので、シーケンスとしては、(大雑把にいうと)文字単位になっていたのですが、これを行単位に分けて文字列リストとして比較させました。

投稿2019/02/04 20:48

wwbQzhMkhhgEmhU

総合スコア343

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

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

saita

2019/02/05 12:47

ありがとうございました。素早く回答いただき助かりました。 勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問