1

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

示例页面

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

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

我将如何提取它?

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

4

4 回答 4

1

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

如果您没有 HTML,这应该可以帮助您:如何在 PHP 中获取网页的 HTML 代码?

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 您将检索遵循相同模式的所有网络数字,它们将位于 $hits 数组中。

于 2012-11-05T12:54:45.363 回答
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 解析器可能是两个字符串匹配的开销,并且如果站点上的内容发生更改,可能会以相同的方式制动。

于 2012-11-05T13:08:57.680 回答
0

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

1) 使用 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

于 2012-11-05T13:01:56.760 回答
0

这可以使用 Xpath 完成:

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

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

Firebug 允许您在控制台中测试 Xpath 查询,使用$x

$x("(//td[contains(text(), 'Number')])[1]/../td[2]");

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

于 2012-11-05T12:54:12.520 回答