質問するログイン新規登録
Python 3.x

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

HTML

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

Q&A

解決済

1回答

1705閲覧

PythonでHTMLのtablesの特定の行をスクレイピングしたい

k15uke

総合スコア1

Python 3.x

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

HTML

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

0グッド

1クリップ

投稿2022/11/08 13:22

0

1

前提

Pythonでサイトのスクレイピングをしようとしています。
イメージ説明

「合計」の行を1つずつ取り出したく、以下コードを書きました。

該当のソースコード

Python

1driver.get(url) 2 html2 = driver.page_source.encode('utf-8') 3 soup2 = BeautifulSoup(html2,'lxml') 4 data = soup2.find("th",text="合計").find_next("td").text 5 data2 = soup2.find("td",text=data).find_next("td").text 6 data3 = soup2.find("td",text=data2).find_next("td").text 7 data4 = soup2.find("td",text=data3).find_next("td").text 8 data5 = soup2.find("td",text=data4).find_next("td").text 9 data6 = soup2.find("td",text=data5).find_next("td").text 10 data7 = soup2.find("td",text=data6).find_next("td").text 11 data8 = soup2.find("td",text=data7).find_next("td").text 12 data9 = soup2.find("td",text=data8).find_next("td").text 13 data10 = soup2.find("td",text=data9).find_next("td").text 14 data11 = soup2.find("td",text=data10).find_next("td").text 15 data12 = soup2.find("td",text=data11).find_next("td").text 16 data13 = soup2.find("td",text=data12).find_next("td").text 17 data14 = soup2.find("td",text=data13).find_next("td").text 18 data15 = soup2.find("td",text=data14).find_next("td").text 19 data16 = soup2.find("td",text=data15).find_next("td").text 20 data17 = soup2.find("td",text=data16).find_next("td").text 21 data18 = soup2.find("td",text=data17).find_next("td").text 22 print("総アクセス数 ") 23 print(data) 24 print("パソコン ") 25 print(data2) 26 print("スマホ ") 27 print(data3) 28 print("携帯 ") 29 print(data4) 30 print("マイガール数 ") 31 print(data5) 32 print("口コミ数 ") 33 print(data6) 34 print("キテネ送信数 ") 35 print(data7) 36 print("オキニトーク 送信したユーザー数 ") 37 print(data8) 38 print("オキニトーク 送信回数 ") 39 print(data9) 40 print("写メ日記(画像・テキスト) 投稿数 ") 41 print(data10) 42 print("写メ日記(画像・テキスト) 通常 ") 43 print(data11) 44 print("写メ日記(画像・テキスト) 会員限定 ") 45 print(data12) 46 print("写メ日記(画像・テキスト) マイガール限定 ") 47 print(data13) 48 print("写メ日記(画像・テキスト) 時間限定 ") 49 print(data14) 50 print("写メ日記(動画) 通常") 51 print(data15) 52 print("写メ日記(動画) 会員限定 ") 53 print(data16) 54 print("写メ日記(動画) マイガール限定 ") 55 print(data17) 56 print("写メ日記(動画) 時間限定 ") 57 print(data18)

実行結果

イメージ説明

5番目までは正確に取れる(ページによって取れなかったりする)のですが、
それ以降は全然違う数値が出てきます。

取り方が悪いのだと思いますが、初心者ゆえどうすればいいか分かりません。
ご教示いただけますでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

「テキスト部分が指定の物であるtdを探す」という方針でやっているために、複数のtdが該当して、希望じゃない方を使っているのでは無いでしょうか。

普通は、「テキストが"合計"であるthの親要素のtrを得て、そのtrの子要素のtdを全部取得」という方針でやります。

投稿2022/11/09 14:13

otn

総合スコア86372

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

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

k15uke

2022/11/10 01:18

ありがとうございます。 def getGirlsData(): driver.get(openurl) html = driver.page_source.encode('utf-8') soup = BeautifulSoup(html,'lxml') month = soup.find('th').text month = month.replace(" ","") month = month.replace("\n","") linklist = [] ShopName = "店舗名" #とりあえず仮で置いておく for name in soup.find_all('th',class_='table_head fixed_row js-girlSearchData girl-data'): title = name.text title = title.replace("\n","") f.write(month) print(month) print(" ") f.write(",") f.write(ShopName) print(ShopName) print(" ") f.write(",") f.write(title) print(title) print(" ") f.write(",") url = name.find('a') url = url.get('href') url = "https://newmanager.cityheaven.net"+url linklist.append(url) driver.get(url) html2 = driver.page_source.encode('utf-8') soup2 = BeautifulSoup(html2,'lxml') table = soup2.find_all('table')[2] columns = [] tbody = table.find('tbody') trs = tbody.find_all('tr') rows = [columns] sums = str('合計') girl_colums = [] count_girl_colums = 0 for tr in trs: row = [td.text for td in tr.find_all(["th","td","tr"])] if '合計' in row: for i in range(int(len(row))): count_girl_colums = i if count_girl_colums == 18: print('オキニトークが存在') for j in range(18): f.write(row[j+1]) f.write(",") f.write("\n") break if count_girl_colums == 16: print('オキニトークが存在しない') for k in range(7): f.write(row[k+1]) f.write(",") f.write('-') f.write(',') f.write('-') f.write(',') for l in range(9): f.write(row[l+8]) f.write(",") f.write('\n') break f.write('\n') f.write(",") f.close() driver.close() 自己解決ですがこんな感じで解決しました。 ありがとうございました。 もっと簡略化できると思いますが、自分ではこれが限界でした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問