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> </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());