8

我正在使用 PHP Simple HTML DOM Parser 来抓取网上商店的一些数据(也使用 PHP5.3.0 运行 XAMPP 1.7.2),并且遇到了<tbody>标签问题。表的结构本质上是(细节并不那么重要):

<table>
  <thead>
    <!--text here-->
  </thead>
  <tbody>
    <!--text here-->
  </tbody>
</table>

现在,我正在尝试<tbody>使用代码进入该部分:

$element = $html->find('tbody',0)->innertext;

它不会抛出任何错误,当我尝试回显它时,它只会打印任何内容。我已经在其他元素上测试了代码,<thead>, <table>,甚至类似的东西<span class="price">,它们都工作正常(当然,删除“,0”会使代码失败)。他们都给出了正确的部分。外文同上。但这一切都失败了<tbody>

现在,我浏览了 Parser,但我不确定我是否能弄清楚。我注意到它<thead>甚至没有被提及,但它工作正常。耸耸肩

我想我可以尝试做儿童导航,但这似乎也有问题。我刚刚尝试运行:

$el = $html->find('table',0);
$el2 = $el->children(2);
echo $el2->outertext;

没有骰子。尝试用 1 替换childrenfirst_child2,仍然没有骰子。不过,有趣的是,如果我尝试->find代替children,它会完美运行。

我非常有信心可以找到解决整个问题的方法,但是这种行为似乎很奇怪,可以在这里发布。我好奇的头脑很高兴能得到所有帮助。

4

4 回答 4

31

在 simple_html_dom.php 文件注释或删除行 #396

// if ($m[1]==='tbody') continue;
于 2010-10-31T05:53:51.063 回答
3

这里有一个关于这个问题的错误报告:http: //sourceforge.net/p/simplehtmldom/bugs/79/

在撰写本文时,它仍然开放。如果您不想修改源代码,还有一个替代修复方法,例如在循环中<tr>查找

<?php
  // The *BROKEN* way to find the <tr>'s 
  // below the <tbody> below the <table id="foo">
  foreach($dom->find('tbl#foo tbody tr') as $tr) {
    /* you will get nothing */
  }

您可以在迭代all 时有选择地检查父标记名称,<tr>如下所示:

<?php
  // A workaround to find the <tr>'s 
  // below the <tbody> below the <table id="foo">
  foreach($dom->find('tbl#foo tr') as $tr) { // note the lack of tbody selector
    /* you will get all trs, but let's only work with ones with the parent
       of a tbody! */
    if($tr->parent->tag == 'tbody') { // our workaround
      /* this part will work as you would expect the above broken code to work */
    }
  }

另请注意,我遇到的一个稍微不相关的问题是,Chrome 和 FF 检查员将更正关于<tbody>and的标签汤<thead>。小心——只看实际来源——如果遇到无法解释的问题,请远离 DOM 检查员。

于 2014-05-23T20:16:19.080 回答
1

确保您tbody来自某些 javascript 执行。我在使用 span 标签时遇到了同样的问题。后来我发现,如果任何 html 代码通过 jquery/任何其他 javascript 执行进入页面,那么在这种情况下simple_html_dom就会失败。

于 2010-08-29T08:49:00.040 回答
1

确保 tbody 确实存在。许多浏览器会在检查面板中的表中添加一个 tbody,即使它们没有出现在响应中。

于 2012-09-24T01:19:22.403 回答