使用Goute PHP在嵌套的div类中获取内容

时间:2017-12-17 11:34:50

标签: php laravel domcrawler

抱歉英语不好。 所以我想从网站上删除一些内容,但div类是嵌套的,让我感到困惑。

基本上结构是:

<div id="gsc_vcd_table">
  <div class="gs_scl">
    <div class="gsc_vcd_field">
      Pengarang
    </div>
    <div class="gsc_vcd_value">
      I Anggara Wijaya, Djoko Budiyanto Setyohadi
    </div>
  </div>
  <div class="gs_scl">
    <div class="gsc_vcd_field">
      Tanggal Terbit
    </div>
    <div class="gsc_vcd_value">
      2017/3/1
    </div>
  </div>
</div>

我想从 Pengarang 字段获取文字 I Anggara Wijaya,Djoko Budiyanto Setyohadi ,并从 2017/3/1 > Tanggal Terbit 字段。

$crawlerdetail=$client->request('GET',$detail);
   $detailscholar=$crawlerdetail->filter('div.gsc_vcd_table');
   foreach ($detailscholar as $key) 
   {
        $keyCrawler=new Crawler($key);
        $pengarang=($scCrawler->filter('div.gsc_vcd_value')->count()) ? $scCrawler->filter('div.gsc_vcd_value')->text() : '';
        echo $pengarang;
   }

请帮帮我。

1 个答案:

答案 0 :(得分:0)

如果您想使用SimpleXMLElement课程。

请参阅此代码:

<?php
$string = <<<XML
<div id="gsc_vcd_table">
  <div class="gs_scl">
    <div class="gsc_vcd_field">
      Pengarang
    </div>
    <div class="gsc_vcd_value">
      I Anggara Wijaya, Djoko Budiyanto Setyohadi
    </div>
  </div>
  <div class="gs_scl">
    <div class="gsc_vcd_field">
      Tanggal Terbit
    </div>
    <div class="gsc_vcd_value">
      2017/3/1
    </div>
  </div>
</div>
XML;

$xml = new SimpleXMLElement($string);

$result1 = $xml->xpath("//div[contains(@class, 'gsc_vcd_field')]");
$result2 = $xml->xpath("//div[contains(@class, 'gsc_vcd_value')]");

foreach ($result1 as $key => $node) {
    echo "FIELD: $result1[$key] , VALUE: $result2[$key]<br>\n";
}

并且对于获取任何元素的xpath模式,您可以在chrome中使用inspect,并复制XPath。

另一个解决方案是使用preg_match_all,请参阅:

preg_match_all('/<div class="gsc_vcd_field">\r\n(.*?)\r\n.*<\/div>\r\n.*<div class="gsc_vcd_value">\r\n(.*?)\r\n.*<\/div>/', $string, $matches);

foreach ($matches[1] as $key => $match) {
    echo "FIELD: " . $matches[1][$key] . " , VALUE: " . $matches[2][$key] . "<br>\n";
}