Php Can';t使用simplehtmldom正确分离细胞

Php Can';t使用simplehtmldom正确分离细胞,php,screen-scraping,simple-html-dom,Php,Screen Scraping,Simple Html Dom,我想写一个网页刮板。我想把所有的单元格排成一行。我想要的那一行之前的行将纯种会议作为其纯文本值。我可以成功地获得这一行。但我不知道如何获取下一行的子元素,即单元格或标记 if ($foundTag = FindTagByText("THOROUGHBRED MEETINGS", $html)) { $cell = $foundTag->parent(); $row = $cell->parent(); $nextRow = $row->next_sibl

我想写一个网页刮板。我想把所有的单元格排成一行。我想要的那一行之前的行将纯种会议作为其纯文本值。我可以成功地获得这一行。但我不知道如何获取下一行的子元素,即单元格或
标记

if ($foundTag = FindTagByText("THOROUGHBRED MEETINGS", $html))
{
    $cell = $foundTag->parent();
    $row = $cell->parent();
    $nextRow = $row->next_sibling();
    echo "Row: ".$row->plaintext."<br />\n";
    echo "Next Row: ".$nextRow->plaintext."<br />\n";
    $cells = $nextRow->children();

    foreach ($cells as $cell)
    {
        echo "Cell: ".$cell->plaintext."<br />\n";
    }
}

function FindTagByText($text, $html)
{
    // Use Simple_HTML_DOM special selector 'text'
    // to retrieve all text nodes from the document
    $textNodes = $html->find('text');
    $foundTag = null;

    foreach($textNodes as $textNode) 
    {
        if($textNode->plaintext == $text) 
        {
            // Get the parent of the text node
            // (A text node is always a child of
            //  its container)
            $foundTag = $textNode->parent();
            break;
        }
    }

    return $foundTag;
}
if($foundTag=FindTagByText(“纯种会议,$html))
{
$cell=$foundTag->parent();
$row=$cell->parent();
$nextRow=$row->next_sibling();
回显“行:”.$Row->纯文本。“
\n”; 回显“下一行:”..nextRow->纯文本。“
\n”; $cells=$nextRow->children(); foreach($cells作为$cell) { 回显“单元格:.$Cell->纯文本。“
\n”; } } 函数FindTagByText($text,$html) { //使用简单的HTML DOM特殊选择器“文本” //从文档中检索所有文本节点的步骤 $textNodes=$html->find('text'); $foundTag=null; foreach($textNodes作为$textNode) { 如果($textNode->plaintext==$text) { //获取文本节点的父节点 //(文本节点始终是的子节点 //(其容器) $foundTag=$textNode->parent(); 打破 } } 返回$foundTag; }
以下是我试图解析的html:

<tr valign=top>
<td colspan=16 bgcolor=#999999><b>THOROUGHBRED MEETINGS</b></td>

</tr>
<tr valign=top bgcolor="#ffffff">
<td><b>BR</b> <a href="meeting?mtg=br&day=today&curtype=0">SUNSHINE COAST</a></td>
<td>FINE/DEAD</b></td>
<td><font color=#cc0000><b>R1</b></font>@<b>12:30pm</b></td>
<td align=center bgcolor=#cc0000><a href="odds?mting=BR01000"><b><font color=#ffffff>1</a></font></td>
<td align=center><a href="odds?mting=BR02000"><b><font color=black>2</b></font></a></td>
<td align=center><a href="odds?mting=BR03000"><b><font color=black>3</b></font></a></td>

<td align=center><a href="odds?mting=BR04000"><b><font color=black>4</b></font></a></td>
<td align=center><a href="odds?mting=BR05000"><b><font color=black>5</b></font></a></td>
<td align=center><a href="odds?mting=BR06000"><b><font color=black>6</b></font></a></td>
<td align=center><a href="odds?mting=BR07000"><b><font color=black>7</b></font></a></td>
<td align=center><a href="odds?mting=BR08000"><b><font color=black>8</b></font></a></td>
<td bgcolor="#ffffff" colspan=4>&nbsp;</td>
</tr>

纯种会议
溴
罚款/死亡
R1@12下午三时三十分
以下是我的输出:

Row: THOROUGHBRED MEETINGS Next Row: BR SUNSHINE COAST FINE/DEAD R1@12:30pm 1 2 3 4 5 6 7 8 CR NEW ZEALAND FINE/DEAD R3@11:10am 1 2 3 4 5 6 7 8 9 DR HOBART OCAST/HVY R1@12:15pm 1 2 3 4 5 6 7 MR CRANBOURNE OCAST/SLOW R1@12:20pm 1 2 3 4 5 6 7 8 NR COFFS HARBOUR OCAST/SLOW R1@12:45pm 1 2 3 4 5 6 7 8 SR MORUYA FINE/GOOD R1@12:25pm 1 2 3 4 5 6 7 8 VR BENALLA OCAST/SLOW R1@12:35pm 1 2 3 4 5 6 7 8 XR KALGOORLIE FINE/GOOD R1@ 3:00pm 1 2 3 4 5 6 7 HARNESS MEETINGS DT LAUNCESTON SHWRY/GOOD R1@ 4:57pm 1 2 3 4 5 6 7 8 9 10 MT CRANBOURNE OCAST/GOOD R1@ 5:05pm 1 2 3 4 5 6 7 8 GREYHOUND MEETINGS AD GAWLER OCAST/GOOD R1@ 5:10pm 1 2 3 4 5 6 7 8 9 10 11 CD CANBERRA OCAST/GOOD R1@ 5:02pm 1 2 3 4 5 6 7 8 9 10 11 MD SALE FINE/GOOD R1@ 4:54pm 1 2 3 4 5 6 7 8 9 10 11 12 Cell: BR SUNSHINE COAST Cell: FINE/DEAD Cell: R1@12:30pm Cell: 1 2 3 4 5 6 7 8 CR NEW ZEALAND FINE/DEAD R3@11:10am 1 2 3 4 5 6 7 8 9 DR HOBART OCAST/HVY R1@12:15pm 1 2 3 4 5 6 7 MR CRANBOURNE OCAST/SLOW R1@12:20pm 1 2 3 4 5 6 7 8 NR COFFS HARBOUR OCAST/SLOW R1@12:45pm 1 2 3 4 5 6 7 8 SR MORUYA FINE/GOOD R1@12:25pm 1 2 3 4 5 6 7 8 VR BENALLA OCAST/SLOW R1@12:35pm 1 2 3 4 5 6 7 8 XR KALGOORLIE FINE/GOOD R1@ 3:00pm 1 2 3 4 5 6 7 HARNESS MEETINGS DT LAUNCESTON SHWRY/GOOD R1@ 4:57pm 1 2 3 4 5 6 7 8 9 10 MT CRANBOURNE OCAST/GOOD R1@ 5:05pm 1 2 3 4 5 6 7 8 GREYHOUND MEETINGS AD GAWLER OCAST/GOOD R1@ 5:10pm 1 2 3 4 5 6 7 8 9 10 11 CD CANBERRA OCAST/GOOD R1@ 5:02pm 1 2 3 4 5 6 7 8 9 10 11 MD SALE FINE/GOOD R1@ 4:54pm 1 2 3 4 5 6 7 8 9 10 11 12 世界其他地区:纯种会议 下一排:BR阳光海岸晴/死R1@12:30pm12345678cr新西兰罚款/死亡R3@11:上午10点1 2 3 4 5 6 7 8 9霍巴特·奥卡斯特博士/HVYR1@12:下午15点1234567克兰伯恩·奥卡斯特先生/慢车R1@12:20 pm 1 2 3 4 5 6 7 8 NR咖啡港奥卡斯特/慢速R1@12:下午45时12345678SR MORUYA罚款/良好R1@12:下午25时12345678VR贝纳拉OCAST/慢R1@12:35pm 1 2 3 4 5 6 7 8 XR KALGOORLIE FINE/GOOD R1@3:00pm 1 2 3 4 5 6 7 HARNESS MEETINGS DT LAUNCESTON Shry/GOOD R1@4:57pm 1 2 3 4 5 6 7 8 10 MT CRANBOURNE OCAST/GOOD R1@5:05pm 1 2 3 4 5 6 7 8灰狗会议AD GAWLER OCAST/GOOD R1@5:10pm 1 2 3 4 5 6 6 7 R1@5:02pm堪培拉OCAST/GOOD R1@5 2 3 4 5 6 6 6 6 7 78 9 10 11 MD销售罚款/良好R1@4:54下午1 2 3 4 5 6 7 8 9 10 11 12 手机号码:BR阳光海岸 牢房:好/死 单元格:R1@12下午三时三十分 电池:1 2 3 4 5 6 7 8 CR新西兰精细/死亡R3@11:上午10点1 2 3 4 5 6 7 8 9霍巴特·奥卡斯特博士/HVYR1@12:下午15点1234567克兰伯恩·奥卡斯特先生/慢车R1@12:20 pm 1 2 3 4 5 6 7 8 NR咖啡港奥卡斯特/慢速R1@12:下午45时12345678SR MORUYA罚款/良好R1@12:下午25时1 2 3 4 5 6 7 8 VR BENALLA OCAST/慢速R1@12:35pm12345678xrKALGOORLIE FINE/GOOD R1@3:00pm 12 3 4 5 6 7 HARNESS MEETINGS DT LAUNCESTON Shry/GOOD R1@4:57pm 12 3 4 5 6 7 8 9 10 MT CRANBOURNE OCAST/GOOD R1@5:05pm 12 3 4 5 6 7 8 GREYHOUND MEETINGS AD GAWLER OCAST/GOOD R1@5:10pm 12 3 3 3 4 5 5 6 6 7 8 9 10 11 CD堪培拉OCAST R1@5:02pm 12 3 3 4 5 6 7 8 9 10 11 MD销售FINE/GOOD R1@4:5412 3 4 5 6 7 8 9 10 11 12
您将获得第一个td,如下所示:

$firstTD = $row->first_child();
在此之后,您可以通过以下方式获得后续内容:

$firstTD->next_sibling()

你不会喜欢我的回答的

不幸的是,您正在解析的HTML中不匹配的结束标记似乎令人困惑
Simple\u HTML\u DOM
。请看以下片段:

<td align=center><a href="odds?mting=BR02000"><b><font color=black>2</b></font></a></td>


编辑:另一种选择是,如果有更好的结果,您可能想试试。它在PHP5中可用,无需外部库。检查。

我将其放入DOMDocument()以更正格式错误的HTML,从而使其正常工作

$url = "http://www.acttab.com.au/interbet/venues?day=today";

$doc = new DOMDocument();
$doc->loadHTMLFile($url);

//convert $doc to html
$html = str_get_html($doc->saveHTML());

您希望输出是什么样子的?我很困惑,因为看起来您的输出正是您想要的,不是吗?输出应该是:Cell:BR SUNSHINE COAST FINE/DEADR1@12:30pm12345678电池:CR新西兰罚款/死亡R3@11:上午10时1 2 3 4 5 6 7 8 9单元:HOBART OCAST博士/HVYR1@12:15pm 1 2 3 4 5 6 7等致命错误:调用未定义的方法simple_html_dom_node::child_nodes()在第37行的/var/www/php.php中致命错误:在第37行的/var/www/php.php中调用未定义的方法simple\u html\u dom\u node::domnode\u next\u sibling()。。它是
$firstTD->next_sibling()我仍然会遇到与该代码相同的问题。它只是将所有的兄弟姐妹混合到一个字段中。它没有将
标记分开。操作HTML解析是一个相当复杂的主题。恐怕我帮不了你。1+用于发现无效的html。我没注意到。Glen,我认为你要么接受无效语法无法正确解析的事实。或者,如果您真的需要解析此页面,只需硬编码即可。如果您首先删除所有和标记,您应该能够解析其余的。@Wouter van Nifterick:应该。。。我们不知道页面的其余部分以及它如何影响解析。但对于这个片段来说,这是一个可行的解决方案。
$url = "http://www.acttab.com.au/interbet/venues?day=today";

$doc = new DOMDocument();
$doc->loadHTMLFile($url);

//convert $doc to html
$html = str_get_html($doc->saveHTML());