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

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

詳細はこちら
Python 3.x

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

Q&A

解決済

2回答

4283閲覧

【Python】スクレイピングで取得したデータの余計な文字を消去したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

1クリップ

投稿2019/10/19 04:38

前提・実現したいこと

スクレイピングで取得したデータの'\xa0'や'\n'という余計な文字を消去したいです。

発生している問題・エラーメッセージ

{'url': 'https://db.netkeiba.com/race/201906010111/', 'title': '第68回日刊スポ賞中山金杯(G3)', 'race_data': '芝右2000m\xa0/\xa0天候 : 晴\xa0/\xa0芝 : 良\xa0/\xa0発走 : 15:35', 'race_data2': '2019年1月5日 1回中山1日目 サラ系4歳以上オープン\xa0\xa0(国際)', 'shoukin': '4,156.7', 'chaku': '1', 'waku': '6', 'umaban': '11', 'umamei': '\nウインブライト\n\n', 'seirei': '牡5', 'kinryou': '58', 'kishu': '\n松岡正海\n\n', 'tanshou': '8.4', 'ninki': '3', 'taijyuu': '490(+12)', 'choukyoushi': '\n[東]\n畠山吉宏\n\n', 'banushi': '\nウイン\n\n'}

該当のソースコード

from typing import Iterator import time import re import requests import lxml.html import csv def main(): session = requests.Session() response = requests.get('https://db.netkeiba.com/?pid=race_list&word=%C6%FC%B4%A9%A5%B9%A5%DD%A1%BC%A5%C4%BE%DE%C3%E6%BB%B3%B6%E2%C7%D5') response.encoding = response.apparent_encoding urls = scrape_list_page(response) for url in urls: time.sleep(1) response = session.get(url) edata = scrape_detail_page(response) print(edata) break def scrape_list_page(response: requests.Response) -> Iterator[str]: html = lxml.html.fromstring(response.text) html.make_links_absolute(response.url) for a in html.cssselect('a[title*="(G3)"]'): url = a.get('href') yield url def scrape_detail_page(response: requests.Response) -> dict: html = lxml.html.fromstring(response.content) edata = { 'url' : response.url, 'title' : html.cssselect('dl.racedata.fc h1')[0].text_content(), 'race_data' : html.cssselect('dl.racedata.fc span')[0].text_content(), 'race_data2' : html.cssselect('p.smalltxt')[0].text_content(), 'shoukin' : html.cssselect('table.race_table_01.nk_tb_common td.txt_r')[4].text_content(), 'chaku' : html.cssselect('table.race_table_01.nk_tb_common td.txt_r')[0].text_content(), 'waku' : html.cssselect('table.race_table_01.nk_tb_common span')[0].text_content(), 'umaban' : html.cssselect('table.race_table_01.nk_tb_common td.txt_r')[1].text_content(), 'umamei' : html.cssselect('table.race_table_01.nk_tb_common td.txt_l')[0].text_content(), 'seirei' : html.cssselect('table.race_table_01.nk_tb_common td.txt_c')[0].text_content(), 'kinryou' : html.cssselect('table.race_table_01.nk_tb_common td.txt_c')[1].text_content(), 'kishu' : html.cssselect('table.race_table_01.nk_tb_common td.txt_l')[1].text_content(), 'tanshou' : html.cssselect('table.race_table_01.nk_tb_common td.txt_r')[3].text_content(), 'ninki' : html.cssselect('table.race_table_01.nk_tb_common span')[2].text_content(), 'taijyuu' : html.cssselect('table.race_table_01.nk_tb_common td[nowrap="nowrap"]')[14].text_content(), 'choukyoushi' : html.cssselect('table.race_table_01.nk_tb_common td.txt_l')[2].text_content(), 'banushi' : html.cssselect('table.race_table_01.nk_tb_common td.txt_l')[3].text_content(), } return edata if __name__ == '__main__': main()

試したこと

'banushi' : html.cssselect('table.race_table_01.nk_tb_common td.txt_l')[3].text.strip('\n'),

text.strip()は試してみましたが、

'banushi': '' ```の様に表示されて上手くいきません。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Pythonリファレンス

~.stripは、先頭と末尾から指定文字を削除するだけです。
~.replace('\n','').replace('\xa0,'')と、空に置換してください。

投稿2019/10/19 06:49

編集2019/10/19 07:53
otn

総合スコア85893

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

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

退会済みユーザー

退会済みユーザー

2019/10/19 07:52

出来ました!ありがとうございます!
guest

0

text_content()じゃなくてtextをstrip()しようとしているせいでは?

それでだめなら正規表現で。

python

1import re 2re.sub(r'\s*', '', '\nfoo\n\xa0bar\n\n') # => 'foobar'

投稿2019/10/19 06:48

kairi003

総合スコア1332

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

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

退会済みユーザー

退会済みユーザー

2019/10/19 07:55

'banushi' : html.cssselect('table.race_table_01.nk_tb_common td.txt_l')[3].re.sub(r'\s*', '', '\nfoo\n\xa0bar\n\n') としたところ、 'HtmlElement' object has no attribute 're' というエラーが出てしまいました。正規表現の使い方がイマイチ分かりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問