0

这是我在网站上的第一篇文章,所以请多多包涵

好的,所以我是 PHP 的完整初学者,我的项目对它有特定的需求。我希望你们中的一些人可以提供帮助!

基本上,我想抓取一个网页并访问某个 html 表及其信息。我需要解析出这些信息并简单地将其格式化为所需的结果。

那么从哪里开始.....继承人我到目前为止写的php

<?php

$url = "http://www.goldenplec.com/festivals/oxegen-2/oxegen-2011";
$raw = file_get_contents($url);

$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$content = str_replace($newlines, "", html_entity_decode($raw));

$start = strpos($content,'<table style="background: #FFF; font-size: 13px;"');
$end = strpos($content,'</table>',$start) + 8;

$table = substr($content,$start,$end-$start);

echo $table;


/* Regex here to echo the desired result */


?>

该 URL 包含我需要的表。我的代码将简单地回显那个确切的表格。

但是,这是我的问题,我绝不是 reg-ex 专家,我需要以某种格式显示表格中的数据。我想回显一个包含许多 sql 插入语句的 xml 文件,如下所示:

$xml_output .= "<statement>INSERT INTO timetable VALUES(1,'Black Eyed Peas','Main Stage','Friday', '23:15')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(2,'Swedish House Mafia','Vodafone Stage','Friday', '23:30')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(3,'Foo Fighters','Main Stage','Saturday', '23:25')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(4,'Deadmau5','Vodafone Stage','Saturday', '23:05')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(5,'Coldplay','Main Stage','Sunday', '22:25')</statement>";
$xml_output .= "<statement>INSERT INTO timetable VALUES(6,'Pendalum','Vodafone Stage','Sunday', '22:15')</statement>";

我希望我已经提供了足够的信息,我将非常感谢你们善良的人们的任何帮助。

提前致谢。

4

1 回答 1

2

在进行抓取时,最好使用 XPATH 之类的东西。我得到了所有<TD>元素,确定场地总是UPPERCASE,所以我们可以利用它来发挥我们的优势。我们还得到了日期列表和一些空格,所以我跳过了这些。我通过检查来确定行为部分的开始":",它表示时间。鉴于该事件持续 3 天,并且数据交错的安排每天都在起作用,我只是增加这一天,然后在它到达事件的最后一天时将其重置。

可能这里发生了一些字符编码问题,但不想过多地干预。那里可能有更优雅的解决方案。

编辑:刚刚注意到并非所有行为都完全交错 3 天,所以这将更难获得事件的日期。下面的代码不会为每个动作提供准确的日期。主要是“小绿车”和“Touchwood”

Edit2:代码现在已更新,应该正确解析所有行为并使用正确的日期。没有安排任何事情的违规日期由两个空字符串 ( "") 表示。我们可以检测到这些并增加我们的$day计数器。

<?php

libxml_use_internal_errors(true);

$url = "lineup2011.html";
$rawHTML = file_get_contents($url);

$dom = new DOMDocument();
$dom->loadHTML($rawHTML);


$xpath = new DOMXPath($dom);

$nodeList = $xpath->query("//table//td");

$nodeCount = 0;
$venue = "";
$day = 0;
$acts = array();

while ($nodeCount < $nodeList->length) {
    $value = $nodeList->item($nodeCount)->nodeValue;

    if (isUpper($value) && strpos($value, ":") === false && $value != "") {
        $venue = $value;
        $nodeCount += 7;
        $day = 0;
        continue;
    }

    if ($value == "" && $nodeList->item($nodeCount + 1)->nodeValue == "") {
        $day++;
        $nodeCount += 2;
        continue;
    }

    $act = array();
    $act['time'] = $value;
    $act['name'] = $nodeList->item($nodeCount + 1)->nodeValue;
    $act['venue'] = $venue;

    $act['day'] = $day % 3;


    $day++;

    $acts[] = $act;
    $nodeCount += 2;
}

print_r($acts);


function isUpper($str) {
    return (strtoupper($str) == $str);
}
于 2011-11-04T01:26:37.167 回答