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

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

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

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

Python

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

Q&A

解決済

2回答

2507閲覧

Python BeatifulSoupで取得したHTMLの特定の最後の要素を取得したい

bellsmarket

総合スコア62

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/12/24 23:43

編集2017/12/24 23:44

BeatifulSoupを使用して、あるサイトのHTMLから特定の要素のouterHTMLを取得しました。
さらに取得したHTMLの下記の要素の値を取得したいのですが
どのように取得すればいいのでしょうか?
table#chart > tbody > tr > tdの最後の要素(e.g. <td>-4132</td>

###該当のソースコード

Python

1#!/usr/local/python3 2from bs4 import BeautifulSoup 3import requests 4 5local = "http://localhost:8000/" 6url = F"{local}hogehoge.html" 7r = requests.get(url) 8soup = BeautifulSoup(r.text, 'lxml') 9Data = soup.select('table#chart') 10 11#--------------------取得したHTML--------------------------- 12<table class="data hide" id="chart"> 13 <thead> 14 <tr> 15 <td></td> 16 <th scope="col">564</th> 17 <th scope="col">1764</th> 18 <th scope="col">4165</th> 19 <th scope="col">5365</th> 20 <th scope="col">7285</th> 21 <th scope="col">9145</th> 22 <th scope="col">11005</th> 23 <th scope="col">12926</th> 24 <th scope="col">14727</th> 25 <th scope="col">16586</th> 26 <th scope="col">18387</th> 27 <th scope="col">20187</th> 28 <th scope="col">21988</th> 29 <th scope="col">23848</th> 30 <th scope="col">25648</th> 31 <th scope="col">26908</th> 32 <th scope="col">29369</th> 33 <th scope="col">30569</th> 34 <th scope="col">32489</th> 35 <th scope="col">34289</th> 36 <th scope="col">36149</th> 37 <th scope="col">38010</th> 38 <th scope="col">39870</th> 39 <th scope="col">41671</th> 40 <th scope="col">43651</th> 41 <th scope="col">44911</th> 42 </tr> 43 </thead> 44 <tbody> 45 <tr> 46 <th scope="row"></th> 47 <td>-34</td> 48 <td>-470</td> 49 <td>-788</td> 50 <td>-614</td> 51 <td>-801</td> 52 <td>-1173</td> 53 <td>-1547</td> 54 <td>-1584</td> 55 <td>-1584</td> 56 <td>-1828</td> 57 <td>-2381</td> 58 <td>-2538</td> 59 <td>-2538</td> 60 <td>-2538</td> 61 <td>-2882</td> 62 <td>-2882</td> 63 <td>-2882</td> 64 <td>-2923</td> 65 <td>-3110</td> 66 <td>-3385</td> 67 <td>-3364</td> 68 <td>-3743</td> 69 <td>-4044</td> 70 <td>-3911</td> 71 <td>-4132</td> 72 <td>-4132</td> 73 </tr> 74 </tbody> 75 <tbody> 76 <tr> 77 <th scope="row"></th> 78 <td></td> 79 </tr> 80 </tbody> 81</table> 82#--------------------取得したHTML---------------------------

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

ベストアンサー

table#chart > tbody > tr > td の最後の要素は空文字ですね

<table class="data hide" id="chart"> ... (略) <tbody> <tr> <th scope="row"></th> <td></td> # <================== </tr> </tbody> </table>

<td>-4132</td> を取得したいのであれば最後から2個目なので

td_data = soup.select("table#chart > tbody > tr > td")[-2] print(td_data.get_text())

となります。
または1つ目の table#chart > tbody > tr の最後の td と考えて

tr_data = soup.select("table#chart > tbody > tr")[0] td_data = tr_data.select("td")[-1] print(td_data.get_text())

でしょうか

投稿2017/12/25 00:27

magichan

総合スコア15898

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

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

0

last_td = data.findAll('tbody')[0].find('tr').findAll('td')[25]

tbodyが2つあるので明示的に1つ目と宣言しています。
最初のtbodyっていう話ならdata.find('tbody')でも良いです。
またtr要素はわざわざ選択しなくても良いように見えます。
'td'の最後を選択するので何個目かを直接指定しています。
個数が決まっているなら、xpathで指定するのも良いかと思います。

何個tdがあるのか不明な(個数が変わる)場合は先にtdの数をcountするのも有りです。

# 一つ目のtbody要素の中のtd要素を全て取得 count = len(data.find('tbody').findAll('td')) # 個数(最後のtd)を選択 last_td = data.find('tbody').findAll('td')[count]

tdの中の文字だけが欲しいなら最後に.get_text()を付けると取得できます。

投稿2017/12/25 00:11

poko_poko

総合スコア168

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問