[英]Searching & Extracting Specific text in external webpage via PHP?
我一直在嘗試從電視劇追蹤網站中提取“下一個劇集編號”。 這是一個示例頁面:
向下滾動,您將看到“倒數”,“日期”,“季節”和“數字”。 我想提取那個數字。
我一直在查看源代碼以及簡單HTML DOM來嘗試解決問題,但是我多次失敗。 “數字”具有類“ nextEpInfo”,但“倒數”,“季節” ...等也具有相同的類。
我將如何提取它?
另外,如果可能的話,我將非常感謝一些很好的參考資料,它們解釋了您推薦的方法,因為當我需要提取的內容包裝在不同的類,div中時,我理想地希望將來學習如何處理這些情況。等等
如果您具有要解析的頁面的原始HTML,則可以使用preg_match進行查找。
如果您沒有HTML,這應該可以為您提供幫助: 如何使用PHP獲取網頁的HTML代碼?
此函數使您可以使用正則表達式模式解析字符串。 建議只解析一部分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數組內。
這可以使用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一起使用,請簽出DOMDocument和DOMXpath 。 更具體的DOMDocument.loadHtml
和DOMXpath.query
。
以下是您可以使用的示例偽代碼:
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
<?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解析器可能會導致兩個字符串匹配的開銷,並且如果網站上的內容發生更改,可能會以同樣的方式剎車。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.