php simple_html_dom选择正确的表数据

时间:2017-08-27 09:44:05

标签: php html simple-html-dom

我在html文件中有表格(片段有趣的是我):

<h3 class="subTitle">Odbitki</h3>
<div class="subtitleBottomEdge"></div>
<div class="pad10">
  <table class="mainContentArea">
    <tr>
      <td class="labelFont">Wszystkie odbitki:</td>
      <td class="itemFont">49946</td>
    </tr>
    <tr>
      <td class="labelFont">Kompletne odbitki równoważności (A4/Letter):</td>
      <td class="itemFont">49945.4</td>
    </tr>
    <tr>
      <td class="labelFont">Arkusze dwustronne:</td>
      <td class="itemFont">2735</td>
    </tr>
  </table>
</div>

我需要的只是在“Wszystkie odbitki”之后显示一个数字:Wszystkie odbitki: 49946

我知道在simple_html_dom中有可能,但我不知道如何使用PHP。

代码:

require_once('simple_html_dom.php');

$html = file_get_html('http://127.0.0.1/tabela.html');

$table = null;
$needle = 'Odbitki';
foreach($html->find('h3') as $marker) {
  if ($marker->innertext == $needle) {
    $table = $marker->next_sibling();
    break;
  }
}
$data = array();
if ($table) {
  foreach($table->children() as $k => $tr) {
    foreach($tr->children as $td) {
      $data[$k][] = $td->innertext;
    }
  }
}
echo '<pre>';
print_r($data);

2 个答案:

答案 0 :(得分:1)

根据提供的html结构,您需要更改此行:

if($marker->innertext == $needle) {
    $table = $marker
        // `next_sibling` gets `div class="subtitleBottomEdge"`
        ->next_sibling()
        // `next_sibling` gets `<div class="pad10">`
        ->next_sibling()
        // `first_child` gives you a required table
        ->first_child();
    break;
}
一个单元格的

更新,例如:

foreach($table->children() as $k => $tr) {
    $data[$k][] = $tr
        // `first_child`  gets first `td`
        ->first_child()
        // `next_sibling`  gets second `td`
        ->next_sibling()
        ->innertext;
}

答案 1 :(得分:1)

步骤1.准备

  

您需要做的第一件事就是下载一份   simpleHTMLdom库,可从sourceforge免费获得。

下载中有几个文件,但您唯一需要的是simple_html_dom.php文件;其余的是示例和文档。 https://sourceforge.net/projects/simplehtmldom/

步骤2.解析基础知识

这个库非常易于使用,但在实施之前应该先查看一些基础知识。

正在加载HTML

$html = new simple_html_dom();

// Load from a string
$html->load('<html><body><p>Hello World!</p><p>We're here</p></body>
</html>');

// Load a file
$html->load_file('http://net.tutsplus.com/');

您可以通过从字符串或文件加载HTML来创建初始对象。加载文件可以通过URL或本地文件系统完成。 获得DOM对象后,可以使用find()和创建集合开始使用它。集合是通过选择器找到的一组对象 - 语法与jQuery非常相似。 在您自己的问题page1.html

   <h3 class="subTitle">Odbitki</h3><div class="subtitleBottomEdge"></div>
        <div class="pad10"><table class="mainContentArea">
          <tr>
            <td class="labelFont">Wszystkie odbitki:</td>
            <td class="itemFont">49946</td>
          </tr>
          <tr>
            <td class="labelFont">Kompletne odbitki równoważności (A4/Letter):</td>
            <td class="itemFont">49945.4</td>
          </tr>
          <tr>
          <td class="labelFont">Arkusze dwustronne:</td>
          <td class="itemFont">2735</td>
          </tr>

在这个示例HTML中,我们将看看如何访问第二段中的信息,更改它,然后输出结果。

# create and load the HTML
include('simple_html_dom.php');
$html = new simple_html_dom();
$html->load("page1.html");

# get an element representing the second paragraph
$element1 = $html->find('.labelFont');
$element2 = $html->find('.itemFont');

# modify it
$element1->innertext .= $element2->innertext;

# output it!
echo $html->save();