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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

2回答

1468閲覧

文字列の比較と抽出

yuri124

総合スコア12

Python 3.x

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

0グッド

0クリップ

投稿2017/05/08 11:43

###実現したいこと
Python3を使い、5分毎にサイトの更新を監視し更新されていたら更新した項目だけを表示するプログラムを考えています。(更新される項目はtableタグと分かっています)
そこで、はじめにBeautifulSoupを使って下記のようなプログラムを作り、更新される項目である<table>タグを取りました。(サイトはサンプルにしてあります)

Python

1import urllib.request 2from bs4 import BeautifulSoup 3 4target_url = 'https://www.sample/' 5html = urllib.request.urlopen(target_url).read() 6soup = BeautifulSoup(html, "lxml") 7 8n = soup.select("#main-list > table")[0] 9print(n)

###実行結果A

<tr> <td class="oddnew-L kjTime" nowrap="">18:30</td> <td class="oddnew-M kjCode" nowrap="">7000</td> <td class="oddnew-M kjName" nowrap="">バイク</td> </tr>

上のプログラムの実行により抽出できたtableタグの中身が実行結果Aです。
その後の5分後の更新により
###実行結果B

<tr> <td class="oddnew-L kjTime" nowrap="">18:35</td> <td class="oddnew-M kjCode" nowrap="">5000</td> <td class="oddnew-M kjName" nowrap="">スポーツ</td> </tr> <tr> <td class="oddnew-L kjTime" nowrap="">18:35</td> <td class="oddnew-M kjCode" nowrap="">6500</td> <td class="oddnew-M kjName" nowrap="">レーシング</td> </tr> <tr> <td class="oddnew-L kjTime" nowrap="">18:30</td> <td class="oddnew-M kjCode" nowrap="">7000</td> <td class="oddnew-M kjName" nowrap="">バイク</td> </tr>

となった場合、実行結果AとBを比較して、更新された<tr></tr>項目のみを表示したいと考えています。具体的にはバイクを除いて更新された項目です。
###5分後に表示したい結果

<tr> <td class="oddnew-L kjTime" nowrap="">18:35</td> <td class="oddnew-M kjCode" nowrap="">5000</td> <td class="oddnew-M kjName" nowrap="">スポーツ</td> </tr> <tr> <td class="oddnew-L kjTime" nowrap="">18:35</td> <td class="oddnew-M kjCode" nowrap="">6500</td> <td class="oddnew-M kjName" nowrap="">レーシング</td> </tr>

文字列やタグについて色々調べましたが解決することができませんでした。
この場合どのような処理をした方が効率が良いのか教えていただきたいです。

###補足情報
Python3.5.2 , mac

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

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

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

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

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

guest

回答2

0

Python

1# coding: utf-8 2 3array1 = ['<tr>\ 4 <td class="oddnew-L kjTime" nowrap="">18:30</td>\ 5 <td class="oddnew-M kjCode" nowrap="">7000</td>\ 6 <td class="oddnew-M kjName" nowrap="">バイク</td>\ 7 </tr>'] 8 9 10array2 = ['<tr>\ 11 <td class="oddnew-L kjTime" nowrap="">18:35</td>\ 12 <td class="oddnew-M kjCode" nowrap="">5000</td>\ 13 <td class="oddnew-M kjName" nowrap="">スポーツ</td>\ 14 </tr>', 15 '<tr>\ 16 <td class="oddnew-L kjTime" nowrap="">18:35</td>\ 17 <td class="oddnew-M kjCode" nowrap="">6500</td>\ 18 <td class="oddnew-M kjName" nowrap="">レーシング</td>\ 19 </tr>', 20 '<tr>\ 21 <td class="oddnew-L kjTime" nowrap="">18:30</td>\ 22 <td class="oddnew-M kjCode" nowrap="">7000</td>\ 23 <td class="oddnew-M kjName" nowrap="">バイク</td>\ 24 </tr>'] 25 26array3 = list(set(array2) - set(array1)) 27print(array3)

素人の考えですが、配列を二つ作って差を求めるというのはどうでしょうか。

参考にしたページ
Python で差分リストを取得する

投稿2017/05/08 14:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuri124

2017/05/08 15:04

そんなやり方もあるのですね!参考サイトも載せていただきありがとうございます。勉強させていただきます。
退会済みユーザー

退会済みユーザー

2017/05/08 15:16

私はPython初心者なので信用してはいけませんよ。
guest

0

ベストアンサー

  • 注釈1:setを使っているので更新分のtrエレメントの順番は保障されません。
  • 注釈2:文字列をxmlにしたり色々と黒魔術を使っていますが、本質はそこではなく、文字列をtrエレメント毎に分割してsetオブジェクトにし、最終的にBからAを引いて更新分を導くところです。

python

1from xml.etree.ElementTree import fromstring 2from xml.etree.ElementTree import tostring 3 4 5def itertags(name, source): 6 for el in fromstring('<?xml version="1.0" encoding="UTF-8"?><root>' + source + '</root>').iter(name): 7 yield tostring(el, encoding='unicode') 8 9 10A = '''\ 11<tr> 12<td class="oddnew-L kjTime" nowrap="">18:30</td> 13<td class="oddnew-M kjCode" nowrap="">7000</td> 14<td class="oddnew-M kjName" nowrap="">バイク</td> 15</tr> 16''' 17B = '''\ 18<tr> 19<td class="oddnew-L kjTime" nowrap="">18:35</td> 20<td class="oddnew-M kjCode" nowrap="">5000</td> 21<td class="oddnew-M kjName" nowrap="">スポーツ</td> 22</tr> 23<tr> 24<td class="oddnew-L kjTime" nowrap="">18:35</td> 25<td class="oddnew-M kjCode" nowrap="">6500</td> 26<td class="oddnew-M kjName" nowrap="">レーシング</td> 27</tr> 28<tr> 29<td class="oddnew-L kjTime" nowrap="">18:30</td> 30<td class="oddnew-M kjCode" nowrap="">7000</td> 31<td class="oddnew-M kjName" nowrap="">バイク</td> 32</tr> 33''' 34 35for new_tag in set(itertags('tr', B)) - set(itertags('tr', A)): 36 print(new_tag)

投稿2017/05/08 14:51

編集2017/05/08 14:56
YouheiSakurai

総合スコア6142

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問