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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

445閲覧

JSを使ったスクレイピング

gomasan

総合スコア96

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2023/01/18 01:45

編集2023/01/18 02:21

前提

IDやクラス名が無く、何番目に来るかもその時によって違う場合、特定の文字を認識して値を取得する方法を教えていただきたく質問いたします。

該当のソースコード

<div> <h3 data-a-111 class="header">初期タイトル</h3> <table class="infotable"> <tr data-a-111> <th data-a-111 class>氏名</th> <td data-a-111 class>田中太郎</td> </tr> <tr data-a-111> <th data-a-111 class>電話番号</th> <td data-a-111 class>123-4567-8910</td> </tr> </table> </div> <div> <h3 data-a-111 class="header">タイトル1</h3> <table class="infotable"> <tr data-a-111> <th data-a-111 class>氏名</th> <td data-a-111 class>佐藤たろう</td> </tr> <tr data-a-111> <th data-a-111 class>メールアドレス</th> <td data-a-111 class>sample@gmail.com</td> </tr> <tr data-a-111> <th data-a-111 class>電話番号</th> <td data-a-111 class>123-4567-8910</td> </tr> </table> </div> <div> <h3 data-a-111 class="header">タイトル2</h3> <table class="infotable"> <tr data-a-111> <th data-a-111 class>氏名</th> <td data-a-111 class>鈴木たろう</td> </tr> <tr data-a-111> <th data-a-111 class>メールアドレス</th> <td data-a-111 class>sample@gmail.com</td> </tr> </table> </div>

取得したい値

【取得したい値】

・初期タイトル
田中太郎
123-4567-8910

・タイトル1
佐藤たろう
sample@gmail.com
123-4567-8910

・タイトル2
鈴木たろう
sample@gmail.com

「氏名」「メールアドレス」「電話番号」などの値は固定です。
そのため、「"氏名”"の値がある場合、次のtdのテキストを取得」や「"氏名"の値がある場合、そのクラス内の2番目のクラス(もしくはtdタグ)のテキストを取得」などで取ってくるのかなと思っています。

書き方が分からず、、ご教示いただけますと幸いです。
よろしくお願いいたします。

※使用言語はJavascriptです。

補足

①質問に記載のコードは1つの大きなブロック内に存在し(id名で取得可能)、1番目のh3のブロックは取込対象外(質問に記載のコードは2つ目のh3ブロックでした)

②取得した値は1つずつ変数で格納したい。
・初期タイトル
田中太郎 → 変数「name」
123-4567-8910 → 変数「phoneNum」

・タイトル1
佐藤たろう → 変数「name」
sample@gmail.com → 変数「mailAdress」
123-4567-8910 → 変数「phoneNum」

・タイトル2
鈴木たろう → 変数「name」
sample@gmail.com → 変数「mailAdress」

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

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

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

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

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

yambejp

2023/01/18 01:49 編集

たとえば「<tr th data-a-111>」とか「<td data-a-111 class>田中太郎</td>」 HTMLの文法に沿ってない特殊な属性の付け方をしていませんか?
gomasan

2023/01/18 02:04

すみません!<tr th data-a-111>は間違いで、<tr data-a-111>でした。修正します。 <td data-a-111 class>田中太郎</td>は該当ページそのまま引用(一部数字等は変更)しています。classはクラス名が無いですが、記載がありました。
guest

回答1

0

ベストアンサー

条件がよくわからないのでとりあえず

javascript

1window.addEventListener('DOMContentLoaded', ()=>{ 2 const res=[...document.querySelectorAll('h3')].map(x=>{ 3 return [x.textContent].concat([...x.nextElementSibling.querySelectorAll('td')].map(x=>x.textContent)); 4 }); 5 console.log(res); 6});

調整版

javascript

1window.addEventListener('DOMContentLoaded', ()=>{ 2 const list={"氏名":"name","電話番号":"phoneNum","メールアドレス":"mailAdress" }; 3 const res=[...document.querySelectorAll('h3')].map(x=>{ 4 return Object.fromEntries([...x.nextElementSibling.querySelectorAll('th')].map(x=>{ 5 return [list[x.textContent],x.nextElementSibling.textContent]; 6 })); 7 }); 8 console.log(res); 9});

投稿2023/01/18 01:56

編集2023/01/18 03:55
yambejp

総合スコア114843

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

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

gomasan

2023/01/18 02:20

ありがとうございます!私の記載不足で大変申し訳ないのですが、補足があります。 ①質問に記載のコードは1つの大きなブロック内に存在し(id名で取得可能)、1番目のh3のブロックは取込対象外(質問に記載のコードは2つ目のh3ブロックでした) ②取得した値は1つずつ変数で格納したい。 ・初期タイトル 田中太郎 → 変数「name」 123-4567-8910 → 変数「phoneNum」 ・タイトル1 佐藤たろう → 変数「name」 sample@gmail.com → 変数「mailAdress」 123-4567-8910 → 変数「phoneNum」 ・タイトル2 鈴木たろう → 変数「name」 sample@gmail.com → 変数「mailAdress」 RPAツールに使っておりまして、連携先に値を渡すためそれぞれ変数に格納したいです。 記載いただいた内容をこちらで理解した限りだとそれぞれが配列で返ってくるかなと思っています。 (["田中太郎", "123-4567-8910"]など)この場合、どれをname変数に格納するか判断が難しいかなと思っておりまして・・・ 説明が下手ですみません。
yambejp

2023/01/18 02:52 編集

> 変数で格納したい の意味がわかりません 結果として具体的にどういったデータが取得したいのでしょうか?
gomasan

2023/01/18 03:11

例えば、 let name = tr.querySelector("ここに氏名を取得する式"); let phoneNum = tr.querySelector("ここに電話番号を取得する式"); let mailAdress = tr.querySelector("ここにメールアドレスを取得する式");   return { name: name, phoneNum: phoneNum, mailAdress: mailAdress }; という流れを想定しておりました。
yambejp

2023/01/18 03:54 編集

なるほど、タイトルはいらないのですね? 調整版をご確認ください
gomasan

2023/01/18 11:28

すみません!回答したつもりが通信が切れていたようでした。申し訳ございません。 いただいたコードで実際のデータにあてたところ無事取得できました!!! 本当にありがとうございます。知らない記法がいくつかあったのでとても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問