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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

HTML

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

Q&A

解決済

2回答

1925閲覧

文字列がセルで囲まれているデータを含む、htmlデータをpythonでデータフレームで抽出したい

yayaya22

総合スコア51

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

HTML

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

0グッド

0クリップ

投稿2021/06/28 09:59

編集2021/06/29 09:59

pythonスクレイピングでテーブルデータを抽出しています。outerHTMLで抽出していましたが、テーブル枠がセル結合されているデータを抜くと、改行の<br>タグが邪魔をしてしまい、lot番号がqtyの横にずれてしまいます。
outerHTMLをそのまま使うのではなく、pandasで一行ずつappendをして抽出していくにはどのようなコードが有用か教示いただけると幸いです。
また、
一行
セル結合含む行
一行
のような、セル結合のあとにまた一行なりの行が続く時のappendするif分岐なども教示いただきますと幸いです。

最終的にはCSV出力をします。

イメージ画像
イメージ説明

```python

Table =driver.find_elements_by_id("ListTable")[0]
str_html = Table.get_attribute("outerHTML")
dfs = pd.read_html(str_html)
print((dfs)[0])

データテーブル結果、lotが横並びになってしまう ```python [ type title ship order qty1 lot qty2 AdjPrice 0 P001 Z01 2 0 2 568 573 1 1 NaN]

HTML

1<table width="100%" class="list" id="ListTable"> 2 <tbody><tr><th>type</th><th>title</th><th>order</th><th>ship</th><th>qty</th><th>lot</th><th>qty</th><th>Adj Price</th></tr><tr><td><a target="_blank" href="******" tabindex="5"> 3 P001 4 </a></td><td>Z01</td><td class="rightJustify">2</td><td class="rightJustify">0</td><td class="rightJustify">2</td><td> 5 6 568<br> 7 8 9 573<br></td><td class="rightJustify"> 10 11 1<br> 12 13 1<br></td><td class="totalValues"></td></tr></tbody></table>

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

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

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

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

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

ppaul

2021/06/28 11:19

中途半端に変換したものではなく、もともとのhtmlがあれば方法を考えられるかもしれません。
yayaya22

2021/06/28 11:36

ページ全体のhtmlが必要ということでしょうか。
ppaul

2021/06/28 11:38

できればページ全体が望ましいですが、それができないなら、勝手にタグを削除していないものでテーブルの部分をすべて含むものがあればなんとかなるかもしれません。
yayaya22

2021/06/30 08:05

編集・追記しました。
guest

回答2

0

ありがとうございました。
以下の方法で解決しました。

python

1#半角をカンマにする 2df['lot'] = df['lot'].str.replace(' ', ',') 3 4#カンマをリストに変換 5df['lot'] = df['lot'].str.split(',') 6 7#explodeメソッドでリストを展開させる 8df = df.explode('lot') 9 10>>> print(df) 11 type title order ship qty1 lot qty2 Adj Price 12  P001 Z01 2 0 2   568 1 NaN 13  P001 Z01 2 0 2   573 1 NaN 14

投稿2021/07/08 01:31

yayaya22

総合スコア51

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

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

0

ベストアンサー

元々は1行の表ですね。

pandasのDataFrameで一行にしたいなら、requests.getを使ってhtmlに入れてpandasのread_htmlで読み込み、加工すると以下のようになります。

python

1import requests 2import pandas as pd 3url = 'https://aaa.bbb/ttt.html' 4r = requests.get(url) 5html = r.text 6df = pd.read_html(html)[0] 7df.rename(columns={'qty': 'qty1', 'qty.1': 'qty2'}, inplace=True) 8df['lot'] = df['lot'].str.replace(' ', '\n') 9df['qty2'] = df['qty2'].str.replace(' ', '\n')

実行結果は以下のようになるはずです。

python

1>>> print(df) 2 type title order ship qty1 lot qty2 Adj Price 30 P001 Z01 2 0 2 568\n573 1\n1 NaN

これを二行にしたいというのであれば、以下を参考にしてやってください。

DataFrameの1行を複数行に分ける方法について教えてください。

投稿2021/06/30 14:36

ppaul

総合スコア24670

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

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

yayaya22

2021/07/02 01:06 編集

ご回答ありがとうございました。 url = 'https://aaa.bbb/ttt.html' urlは変化せず、読み込んだらjavascriptで変化するタイプのサイトです。 なので、read.htmlメソッドは使えませんでした。 <tr>に入っている要素を引き抜き、そのまま一行ずつ使えないでしょうか。 あるいは<br>が入っている行は、その行をコピーしてlot以外同じものをコピーさせるなど
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問