条件付きで要素を取得したい
次のようなHTMLで、divのclassが「b」内のh2の要素が「ccc」の場合のdivのクラスが「d」の要素を取得したいのです。
つまり下の例では、「111」と「333」を取得したいです。
queryにどのように記述すれば良いのでしょうか?
$document =<<<EOF
<div class=a>
<div class=b>
<h2 class=c>ccc</h2>
<div class=d>111</div>
</div>
<div class=b>
<h2 class=c>ccc[a]</h2>
<div class=d>222</div>
</div>
<div class=b>
<h2 class=c>ccc</h2>
<div class=d>333</div>
</div>
</div>
EOF;
$xpath = new DOMXPath($document);
$xpath->query('ここの記述が知りたい');
No.3
- 回答日時:
//div[@class='a']/div[@class!='b']
だと、「<div class='a'> の子要素の <div> で、classが'b'でないもの」 ですね。
「<div class='a'> の直下のテキスト」だと、
//div[@class='a']/text()
ご回答ありがとうございます。
なるほど、そのやり方でできました。
ありがとうございます。
そこでそれに関連してですが、もう一つ疑問ができまして、、
ただこの質問スレッドでこれ以上引っぱるのもあれなので、
再度新たに質問を立てさせて頂きたいのですが、その場合もアドバイス頂けたらうれしいです。
No.2
- 回答日時:
>それとこのようなquery内の記述方法が乗っているお薦めのサイトなどはありますでしょうか?
私は、下記を見ています。
http://www.doraneko.org/xml/xpath10/19991116/Ove …
ちょっと情報多すぎるなら、
http://ja.wikipedia.org/wiki/XML_Path_Language
とか。
初心者向けには「逆引きXPATH」とかあると良いのかな。
ご回答ありがとうございます。
紹介して頂きありがとうございます。見てみたのですが、
もう一つだけ疑問が湧きまして、申し訳ないのですが教えていただきたいのですが、
$document =<<<EOF
<div class=a><div class=b>bbb</div>aaa<div class=b>bbb</div></div>
EOF;
$doc = DOMDocument::loadHTML($document);
$xpath = new DOMXPath($doc);
$items = $xpath->query("//div[@class='a']/div[@class!='b']");
foreach ($items as $item) {
$arr[] = $item->nodeValue;
}
print_r($arr);
上の例で、 クラスが「a」の要素で、かつ、クラスが「b」の要素は取得したくない(つまり「aaa」のみ取得したい)
のですが、一応上のように記述しましたが、もちろんできなかったのですが、
この場合はどのように記述すれば良いのでしょうか?
No.1ベストアンサー
- 回答日時:
質問が曖昧ですが、「divのclassが「b」内のh2の要素が「ccc」の場合、そのh2と同じ階層のdivのクラスが「d」の要素」ということなら、xpathは、
//div[@class='b']/h2[.='ccc']/../div[@class='d']
「divのclassが「b」内のh2の要素が「ccc」の場合、そのh2の直後のdivのクラスが「d」の要素」
だと面倒な気がする。
ただ、プログラム違いませんか?
$doc = DOMDocument::loadHTML($document);
$xpath = new DOMXPath($doc);
$items = $xpath->query("//div[@class='b']/h2[.='ccc']/../div[@class='d']");
では?
この回答への補足
すいません、あれからもしやと思い
print_r($items);
ではなくて
foreach ($items as $item) {
$arr[] = $item->nodeValue;
}
print_r($arr);
で試してみたらできました。
勘違いしてまた、すいません。
ご回答ありがとうございます。
早速それを試して見たのですが、
DOMNodeList Object ( )
とマッチしてないようなのです・・・
何か記述間違いということはないでしょうか?
それとこのようなquery内の記述方法が乗っているお薦めのサイトなどはありますでしょうか?
一応自分でも探してみたのですが、そもそもそのようなことを扱っているサイトが少ないというのもあるのでしょうが、
いまいちよく理解し難いというのがありまして・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タグの中だけ改行を除去したい
-
文字の入力で横バー上段、中断...
-
エスケープ文字の復帰(¥r)と...
-
C言語について。
-
VBAのコマンドボタンの文字列の...
-
パソコンで全角、半角文字の切...
-
sedでの最短一致の書き方
-
漢字を含んだ正規表現
-
PHP 「あいまい検索」を行う関...
-
PHPの正規表現の意味を教えて下...
-
Excelで数字のみを2倍3倍にする...
-
Excel VBAからBeckyを起動して...
-
正規表現
-
preg_matchでエラーが出ます。
-
エクセルでの漢字、カタカナ、...
-
textarea , PHP, 確認画面 改行
-
改行コード(CR/LF)の設...
-
ダブルコーテーション(
-
fscanfについて
-
選択したセルでダブルクリック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現でタグの置換をしたい...
-
htmlのソースからテーブルの値...
-
正規表現で複数行に渡る範囲を...
-
phpでhtmlのタイトルを取得する...
-
PHPの正規表現でHTMLタグの内容...
-
reuterの記事をbeautiful.soup....
-
横1行に2種類の画像を交互に5...
-
変数にHTMLを代入する場合
-
タグにはさまれている文字以外...
-
phpの正規表現でstyle="●●"を削...
-
JSFタグのfタグとは
-
Nvuで作成したhtmlをコピペして...
-
URLの結合
-
正規表現でHTMLタグの属性まで...
-
PHPスクレイピングが上手くいき...
-
firefoxで、特定の文字列を含む...
-
VBSでのhtmlタグ要素名の置換
-
preg_match と正規表現 で URL抽出
-
WordPressのhtmlエディタについて
-
objective-cでのHTMLタグ表示に...
おすすめ情報