搜索&通过PHP在外部网页中提取特定文本?

时间:2012-11-05 10:42:34

标签: php dom

我一直试图从电视剧集追踪网站中简单地提取“下一集编号”。这是一个示例页面:

Example page

向下滚动,您将看到“倒计时”,“日期”,“季节”和“数字”。我想提取这个数字。

我一直在寻找源代码以及Simple HTML DOM来尝试解决问题,但我多次失败。 “数字”有“nextEpInfo”类,但“倒计时”,“季节”等也有同一类。

我将如何提取它?

另外,如果可能的话,我真的很感谢一些很好的参考资料来解释你推荐的方法,因为我希望将来能够学习如何处理这些情况,当我需要提取的内容包含在不同的类中时,divs ...等

4 个答案:

答案 0 :(得分:1)

如果您有要解析的页面的原始HTML,可以使用preg_match来查找它。

如果您没有HTML,这可以帮助您:How do I get the HTML code of a web page in PHP?

preg_match()

此函数允许您使用正则表达式模式解析字符串。建议只获得要解析的HTML的一小部分,而不是所有页面。例如,在这种情况下,我会尝试获取第一个表格的HTML(没有上一集信息的表格)。

$subject="the HTML of the url you want to parse";
$pattern='/Number:<\/td><td.+?>(\d+)<\//';
if(preg_match($pattern, $subject, $hits)){
    echo "Number: $hits[0]";
}

如果您不知道正则表达式的工作原理:

''是一个保留字符,表示“任何字符”,“+”表示“一个或多个”后面的“+”和“?”使正则表达式非贪婪。所以,如果我们总结一下'。+?'是指'一个或多个任何角色,但尽可能缩短'。

'('和')'表示我们想要检索它们之间的内容,'\ d'表示数字。因此'(\ d +)'表示'将这些数字组合放在$ hits数组中'。

如果您使用相同的正则表达式,但使用preg_match_all,您将检索遵循相同模式的Web的所有数字,它们将位于$ hits数组中。

答案 1 :(得分:0)

这可以使用Xpath完成:

(//td[contains(text(), 'Number')])[1]/../td[2]

此查询导航到文本等于Number的第一个td。然后转到那些孩子的父节点(/../),然后转到第二个td (td[2]),其中包含下一集编号。

Firebug允许您使用$x

在控制台中测试Xpath查询
$x("(//td[contains(text(), 'Number')])[1]/../td[2]");

要在PHP中使用它,请查看DOMDocumentDOMXpath。更具体的DOMDocument.loadHtmlDOMXpath.query

答案 2 :(得分:0)

以下是您可以使用的示例伪代码:

1)使用class nextEpInfo检索所有tr:

foreach($html->find('tr.nextEpInfo') as $tr)

2)对于每个tr,验证它们是否包含任何带有stristr的关键字。    示例:if(stristr($tr, 'Countdown') !== FALSE)

3)如果是这种情况,则在tr下提取2个tds的文本内容:    $tds = $tr->find('td')

4)从第二个td获得所需的值:    $tds[1]->plaintext

答案 3 :(得分:0)

<?php
/*

<tr class="nextEpInfo">
<td width="160" align="right" nowrap="" class="nextEpInfo">Season:    </td>
<td class="nextEpInfo" width="300">4</td>
</tr>
*/
$url = 'http://next-episode.net/the-good-wife';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch,CURLOPT_ENCODING, 1);
curl_setopt( $ch, CURLOPT_REFERER, $url );
$content = curl_exec ($ch);
//echo $content;
$matches = array();
preg_match_all( '/class="nextEpInfo">(.+):<\/td>\s*<td[^>]*>(\d*)</', $content, $matches );
print_r( $matches );

或类似的,这是最简单的,并且只要站点的所有者不更改字符串就可以工作。使用xpath或其他xml / html解析器可能是两个字符串匹配的开销,如果站点上的内容发生更改,则可以以相同的方式制动。