簡體   English   中英

通過PHP搜索和提取外部網頁中的特定文本?

[英]Searching & Extracting Specific text in external webpage via PHP?

我一直在嘗試從電視劇追蹤網站中提取“下一個劇集編號”。 這是一個示例頁面:

示例頁面

向下滾動,您將看到“倒數”,“日期”,“季節”和“數字”。 我想提取那個數字。

我一直在查看源代碼以及簡單HTML DOM來嘗試解決問題,但是我多次失敗。 “數字”具有類“ nextEpInfo”,但“倒數”,“季節” ...等也具有相同的類。

我將如何提取它?

另外,如果可能的話,我將非常感謝一些很好的參考資料,它們解釋了您推薦的方法,因為當我需要提取的內容包裝在不同的類,div中時,我理想地希望將來學習如何處理這些情況。等等

如果您具有要解析的頁面的原始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數組內。

這可以使用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

以下是您可以使用的示例偽代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM