6

2 つの部分からなる質問のようなものですが、おそらく一方が他方に答えます。から情報を取得しようとしています

<div id="foo">
<div class="bar"><a data1="xxxx" data2="xxxx" href="http://foo.bar">Inner text"</a>
<div class="bar2"><a data3="xxxx" data4="xxxx" href="http://foo.bar">more text"</a>

これが私が今使っているものです。

$articles = array();
$html=file_get_html('http://foo.bar');
foreach($html->find('div[class=bar] a') as $a){
    $articles[] = array($a->href,$a->innertext);
}

これは、最初の div クラスから href と内部テキストを取得するのに完全に機能します。$a->data1 を foreach に追加しようとしましたが、うまくいきませんでした。

href と innertext を取得すると同時に、これらの内部データ タグを取得するにはどうすればよいですか。

また、1 つのステートメントで両方のクラスを取得する良い方法はありますか? ID から検索を作成し、すべての div 情報を取得できると思います。

ありがとう

4

4 に答える 4

16

これらすべての属性を取得するには、次のように、解析された要素を事前に調査する必要があります。

foreach($html->find('div[class=bar] a') as $a){
  var_dump($a->attr);
}

...そして、それらの属性が存在するかどうかを確認します。これらは有効な HTML ではないように思われるため、パーサーがそれらを破棄する可能性があります。

それらが存在する場合、次のように読み取ることができます。

foreach($html->find('div[class=bar] a') as $a){
  $article = array($a->href, $a->innertext);
  if (isset($a->attr['data1'])) {
    $article['data1'] = $a->attr['data1'];
  }
  if (isset($a->attr['data2'])) {
    $article['data2'] = $a->attr['data2'];
  }
  //...
  $articles[] = $article;
}

両方のクラスを取得するには、コンマで区切って複数のセレクターを使用できます。

foreach($html->find('div[class=bar] a, div[class=bar2] a') as $a){
...
于 2013-01-22T10:49:59.467 に答える
5

この質問は古いことは知っていますが、OP は 1 つのステートメントですべての属性を取得する方法を尋ねました。私が取り組んでいるプロジェクトのためにこれをやっただけです。

メソッドを使用して、要素のすべての属性を取得できますgetAllAttributes()。結果は、 という配列プロパティに自動的に格納されますattr

以下の例では、すべてのリンクを取得していますが、これは好きなように使用できます。注: これはdata-属性でも機能します。したがって、呼び出された属性がある場合は、メソッドを実行data-urlした後にアクセスできます。$e->attr['data-url']getAllAttributes

あなたの場合、探している属性は と に$e->attr['data1']なり$e->attr['data2']ます。OPではないにしても、これが誰かに役立つことを願っています。

すべての属性を取得

$html = file_get_html('somefile.html');
foreach ($html->find('a') as $e) {   //used a tag here, but use whatever you want
    $e->getAllAttributes();

    //testing that it worked
    print_r($e->attr);
}
于 2016-09-30T03:24:03.653 に答える
2
$data1 = $html->find('.bar > a', 0)->attr['data1'];
$data2 = $html->find('.bar > a', 0)->attr['data2'];
于 2019-07-17T06:03:39.713 に答える