2012-11-05 33 views
1

我一直试图简单地从电视剧集跟踪网站中提取“下一集号码”。下面是一个例子页:通过PHP搜索并提取外部网页中的特定文本?

Example page

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

我一直在寻找源代码以及简单的HTML DOM来尝试工作,但我失败了多次。 “数字”有“nextEpInfo”类,但是“倒计时”,“季节”......等也具有相同的类别。

我该如何去提取它?

此外,如果可能的话,我真的很感激一些很好的参考资料,它解释了你推荐的方法,因为我希望在将来需要解决这些情况时,如何处理这些情况, div的...等。

+1

除了匹配的属性(即css类),你需要匹配文本,这里是一个相关的问题:http://stackoverflow.com/questions/3655549/xpath-containstext-some-string-doesnt-工作时使用与节点与更多 – ajreal

+0

@ajreal感谢您的帖子。然而,由于我试图通过Simple HTML Dom提取数字http://simplehtmldom.sourceforge.net/,所以我无法将事情联系在一起,所以我很难理解你引用的答案。如果你有时间可以提供样本代码吗?谢谢! – user1788210

回答

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您将检索遵循相同的模式的所有数字,他们将在$ hits数组内。

+0

非常感谢小费。经过大约5个小时的工作,我设法使用Simple HTML DOM来完成它,而没有任何复杂性。我使用了CURL + HTML DOM的组合。如果他们愿意,我会发布我为别人做的一些看看。 虽然我有一个重要的问题。我知道如何通过file_get_contents()和curl来检索页面,但我不知道如何检索“部分”的目的。感谢任何帮助。 – user1788210

+0

那么,你可以使用任何XML或DOM解析器来获得你想要的XPath的部分,或者你可以像以前一样使用正则表达式来获取所有的'/(

。+?Number:。+?<\/table>)/ ',这应该会给你所有的表格带有一个'Number:'在其任何td/th内。 – Naryl

0

这可以使用XPath来完成:

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

这个查询导航到文本等于Number首款TD。然后它转到该子节点的父节点(/../),然后转到包含下一集编号的第二个td (td[2])

萤火虫,您可以在控制台测试Xpath查询,使用$x

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

用PHP使用,请DOMDocumentDOMXpath。更具体的DOMDocument.loadHtmlDOMXpath.query

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

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解析器可能会导致两个字符串匹配,并且如果网站上的内容发生更改,则可能会以相同的方式制动。

相关问题