🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

1127閲覧

Webスクレイピングで特定のものをHTMLから抜き出すには?

yusuke_0923

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/03/28 06:11

郵便番号・住所を抜き出し、表にまとめたいと思っています。該当のhtmlが以下のものです。うまく郵便番号と住所だけ抜き出す方法と、表にまとめる方法を知りたいです。
長くて申し訳ないです。ちなみにこの住所は自分の好きな焼き肉屋なので他意はないです。

<th style="width: 28%;">住所</th> <td>〒206-0032<br />東京都多摩市南野2-31-7</td> </tr> <tr> <th>TEL</th> <td>042-316-9566</td> </tr> <tr> <th>定休日</th> <td>年中無休</td> </tr> <tr> <th>営業時間</th> <td> <p>【月曜日~木曜日】<br />17:00~22:30(L.O.22:00)<br />【金曜日】<br />17:00~23:00(L.O.22:30)<br />【土曜日】<br />16:30~23:00(L.O.22:30)<br />【日曜日・祝日】<br />16:30~22:30(L.O.22:00)</p> <p><span style="color: #ff0000;">※ご利用時間2時間(L.O30分前)</span></p> </td> </tr> <tr> <th>駐車場</th> <td>有り(36台)</td> </tr> <tr> <th>アクセス</th> <td>小田急多摩線 唐木田駅から車で10分<span class="pc-only"><br /></span></td> </tr> <tr> <th>クレジットカード</th> <td>利用可能(VISA・MasterCard)</td> </tr> <tr> <th>予約</th> <td>【月曜日~金曜日】終日<br />※土曜日・日曜日や祝日はご予約をお受けできません。また予約定数に達した場合、ご予約をお受け致しかねる場合がございます。</td> </tr> </tbody> </table> <div class="box"><iframe width="100%" height="300px" style="border: 0;" src="https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d1621.8938443319612!2d139.4262704!3d35.6083034!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x6018fcbf478fffff%3A0x95c222aed02db60c!2z5ZGz44KT5ZGz44KTIOWkmuaRqeWNl-mHjuW6lw!5e0!3m2!1sja!2sjp!4v1544402052411" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div> <table border="0" cellpadding="5" data-epark="shop_id:173032" style="width: 100%; height: 60px; margin: 0 auto; background-color: #f0f0f0; font-size: 14px;"> <tbody> <tr> <td valign="middle" width="15%"><span style="color: red;"> <img src="https://epark.jp/images/portal_pc/api/clock.png" /> </span></td> <td align="center" data-epark="message_block" style="background-color: #f0f0f0;" valign="middle" width="40%"><strong>ただいまの待ち<br /><span data-epark="waiting_info_block" data-epark-num-color="red"> <span style="color: red;">1</span>組</span></strong></td> <td><span class="more box3"> <a class="add_arrow" href="https://epark.jp/detail/wait/173032?widgetimp=1" target="_blank" rel="noopener noreferrer">順番待ちサイト</a> </span></td> </tr> </tbody> </table> <script src="https://epark.jp/js/api/epark_site_shop_tag.js" charset="utf-8" onload="EparkSiteTag.onLoaded(this)" onreadystatechange="if(typeof EparkSiteTag != 'undefined'){EparkSiteTag.onLoadedIE(this)}">

これに対して以下のソースコードを使っています。

python

1from bs4 import BeautifulSoup 2import urllib.error,os 3import urllib.request 4import time,datetime 5import pandas as pd 6import numpy as np 7 8shop_list = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22'] 9 10url_list = ['https://www.y-minmin.com/shop#a{0}'.format(shop) for shop in shop_list] 11 12print(len(url_list)) 13for url in url_list: 14 print(url) 15 16 17ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100' 18 19req = urllib.request.Request(url_list[0], headers={'User-Agent':ua}) 20html = urllib.request.urlopen(req) 21 22soup = BeautifulSoup(html,("html.parser")) 23 24 25address_list = soup.find_all(['td','br','th']) 26 27for k,v in enumerate(address_list): 28 print(v.get_text().replace(" ","")) 29 30 31post_address = [] 32other = [] 33 34for k,v in enumerate(address_list): 35 36 if k % 2 == 0: 37 post_address.append(v.get_text().replace(" ","")) 38 else: 39 other.append(v.get_text().replace(" ","")) 40 41df = pd.DataFrame({'住所':post_address,'その他':other}) 42

するとこのように返ってきます。

C:\test2>python sub0322.py 22 https://www.y-minmin.com/shop#a01 https://www.y-minmin.com/shop#a02 https://www.y-minmin.com/shop#a03 https://www.y-minmin.com/shop#a04 https://www.y-minmin.com/shop#a05 https://www.y-minmin.com/shop#a06 https://www.y-minmin.com/shop#a07 https://www.y-minmin.com/shop#a08 https://www.y-minmin.com/shop#a09 https://www.y-minmin.com/shop#a10 https://www.y-minmin.com/shop#a11 https://www.y-minmin.com/shop#a12 https://www.y-minmin.com/shop#a13 https://www.y-minmin.com/shop#a14 https://www.y-minmin.com/shop#a15 https://www.y-minmin.com/shop#a16 https://www.y-minmin.com/shop#a17 https://www.y-minmin.com/shop#a18 https://www.y-minmin.com/shop#a19 https://www.y-minmin.com/shop#a20 https://www.y-minmin.com/shop#a21 https://www.y-minmin.com/shop#a22 住所 〒206-0032東京都多摩市南野2-31-7 TEL 042-316-9566 定休日 年中無休 営業時間 【月曜日~木曜日】17:00~22:30(L.O.22:00)【金曜日】17:00~23:00(L.O.22:30)【土曜日】16:30~23:00(L.O.22:30)【日曜日・祝日】16:30~22:30(L.O.22:00) ※ご利用時間2時間(L.O30分前) 駐車場 有り(36台) アクセス 小田急多摩線 唐木田駅から車で10分 クレジットカード 利用可能(VISA・MasterCard) 予約 【月曜日~金曜日】終日※土曜日・日曜日や祝日はご予約をお受けできません。また予約定数に達した場合、ご予約をお受け致し かねる場合がございます。 ただいまの待ち1組 順番待ちサイト

ここまで読んでいただいてありがとうございます。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「郵便番号と住所だけ」を取得したいのであれば下記方法では範囲が広すぎるかと思います。

address_list = soup.find_all(['td','br','th'])

セレクタで対象範囲を絞ると良いです。例えば下記コードです。

soup.select('.table-default tr:nth-child(1) td')

投稿2021/03/28 10:13

meg_

総合スコア10742

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

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

yusuke_0923

2021/03/29 15:19

ありがとうございました。すっきりしました。 因みにさらに住所のみに絞るためにはどうしたらいいですか?
meg_

2021/03/29 15:43

取得した文字列から抽出すれば良いかと思います。今回の場合は<br />の前後で分けられるかと思います。
yusuke_0923

2021/03/30 03:18

どんな感じで書くとスマートですか?
meg_

2021/03/30 11:54

私ならsplit()を使います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問