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

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

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

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

Beautiful Soup

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

376閲覧

競馬ラボというサイトの着順表のページからレース名をスクレイピングした時、ターミナルやExcelのセルに入ってしまう謎の大きな空欄を削除したいです

kazusa

総合スコア3

スクレイピング

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

Beautiful Soup

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2025/01/21 19:33

編集2025/01/22 08:35

実現したいこと

競馬ラボというサイトの着順表のページからレース名を取得した時、ターミナルやExcelのセルに入ってしまう謎の大きな空欄を削除したいです。
この着順表のページ https://www.keibalab.jp/db/race/202411170811/
の『マイルチャンピオンS(G1)』という文字をスクレイピングした時に、ターミナルやExcelのセルに謎の大きな空欄が入ってしまいます。
この大きな空欄を削除して、VSCのターミナルや、openpyxlで入力した時のExcelのセルに、普通に左詰めで文字を表示するようにしたいのですが、そのやり方がわからないので教えてほしいです。

また、おそらく対処法は同じだと思うのですが、https://www.keibalab.jp/db/race/202411170811/course.html
このページの『京都競馬場・芝1600m・外回り』という部分の文字をスクレイピングした時も同様の状況になってしまい、同様に改善したいので改善法を教えてください。

発生している問題・分からないこと

ターミナルでもExcelのセルでも中央寄せのような表示法になってしまっている状況です。
あと『マイルチャンピオンS』と『G1』の間が変に空いてしまっているのでこの直し方も知りたいです。

あとこれはできたらという程度の+α要素なんですが、ターミナル出力の時の文字サイズが若干大きい気がするので、この直し方があったら教えてほしいです。

該当のソースコード

<h1 class="raceTitle fL" itemprop="about"> マイルチャンピオンS <span class="std8">(GⅠ)</span> </h1> #ここと <h3 class="courseHeading"> 京都競馬場・芝1600m・外回り </h3> #ここです ################################################ # あとこういう感じでselectやfindを使ってCSSでhtmlを指定してスクレイピングしています # なのでこういう書き方を少し直して、謎の空欄を削除するとしたら、を教えていただけるとありがたいです。 # すみませんが、よろしくお願いします。 import requests from bs4 import BeautifulSoup course_names = [] race_names = [] #レース実施条件の一行を取得 load_url_kari = "https://www.keibalab.jp/db/race/202411170811/course.html" headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3"} html2 = requests.get(load_url_kari, headers=headers) soup = BeautifulSoup(html2.content, "html.parser") course_name = soup.select('h3[class*="courseHeading"]')[0].text # course_name.replace(" ","") # course_name.ljust(0) course_names.append(course_name) for x in course_names: print(x) # レース名を取得 load_url_kari_2 = "https://www.keibalab.jp/db/race/202411170811/" headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3"} html22 = requests.get(load_url_kari_2, headers=headers) soup2 = BeautifulSoup(html22.content, "html.parser") race_name = soup2.select('h1[class*="raceTitle fL"]')[0].text race_names.append(race_name) for y in race_names: print(y)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

.replace(" ","") や .ljust(0) をとりあえず試したのですが、ダメでした...

補足

使用言語はpythonでBeautifulSoupとrequestsでスクレイピングしています。
なのでこれらで教えてください。
競馬ラボからスクレイピングするにはUserAgentが必要です。

1月22日17時35分追記:Xpathでの回答を頂くことができましたが、実は普段は上記追記ソースコードのようにCSSでスクレイピングしているので、そちらでのやり方を教えていただきたいです。
すみませんが、よろしくお願いします。

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

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

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

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

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

juner

2025/01/21 23:11 編集

対象となる文字が何であるかは調べられましたでしょうか?スペースだけでもいろんな種類がありますので
melian

2025/01/22 01:11 編集

おそらく lxml の XPATH を使用していると思いますので、normalize-space() で文字列の両端にあるスペース類を除去すればよいかと思います。 title = tree.xpath('normalize-space(string(//h1[@class="raceTitle fL"]))') print(title)
kazusa

2025/01/22 08:40

コメントありがとうございます。 ソースコードを追記しました。 実は、以前の質問ではXpathの使用を検討していましたが、結局CSSでスクレイピングしてるので、追記ソースコードのようにfindやselectでCSSでスクレイピングしている場合の対処法について教えていただけないでしょうか、お手数おかけして申し訳ありませんが、どうかよろしくお願いします。
guest

回答2

0

ベストアンサー

CSSでスクレイピングしているので、そちらでのやり方を教えていただきたいです。

h3.courseHeading に関しては strip() で両端のスペース類を除去します。

python

1course_name = soup.select_one('h3.courseHeading').text.strip()

h1.raceTitle.fL の場合は、h1 要素の内部に span 要素があるので、「マイルチャンピオンS」と「 (GⅠ)」の間のスペース類を単一のスペースに変換します。(squeeze処理)

python

1import re 2 3race_name = soup2.select_one('h1.raceTitle.fL').text.strip() 4race_name = re.sub(r'\s+', ' ', race_name)

投稿2025/01/22 08:53

melian

総合スコア20905

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

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

kazusa

2025/01/30 07:10

よくわかりました!ありがとうございました!また機会がありましたら気が向いたらでいいのでよろしくお願いします
guest

0

この手の質問を頻繁に見かけますが、そのサイトにおいてスクレイピングが許容されていますか?
技術的には実現可能であっても、ルールやモラルに反する案件は答えようとする方は出てこないかと思われます。

ターミナルのサイズについてはVSCodeの設定側で調整は可能かと思われます。
Googleなどで検索すると設定については出てくると思われますので、調べてみると良いかもしれません。

投稿2025/01/21 23:01

Refrain

総合スコア646

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

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

kazusa

2025/01/22 07:33

利用規約もrobot.txtも事前に確認しており、スクレイピングが問題ないことを確認済みです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.33%

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

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

質問する

関連した質問