2010-08-09 106 views
1

想從http://www.atpworldtour.com/Rankings/Singles.aspxPHP外部頁面

搶的球員名單沒有與"bioTableAlt"類的表,我們必須抓住所有的後<tr>第一個(類"bioTableHead"),它是用於表的標題。

通緝的內容是這樣的:

<tr class="oddRow"> 
<td>2</td> 
<td> 
    <a href="/Tennis/Players/Top-Players/Novak-Djokovic.aspx">Djokovic, Novak</a> 
    (SRB) 
</td> 
<td> 
    <a href="/Tennis/Players/Top-Players/Novak-Djokovic.aspx?t=rb">6,905</a> 
</td> 
<td>0</td> 
<td> 
    <a href="/Tennis/Players/Top-Players/Novak-Djokovic.aspx?t=pa&m=s">21</a> 
</td> 
</tr> 
<tr> 
<td>3</td> 
<td> 
    <a href="/Tennis/Players/Top-Players/Roger-Federer.aspx">Federer, Roger</a> 
    (SUI) 
    </td> 
<td> 
    <a href="/Tennis/Players/Top-Players/Roger-Federer.aspx?t=rb">6,795</a> 
</td> 
<td>0</td> 
<td> 
    <a href="/Tennis/Players/Top-Players/Roger-Federer.aspx?t=pa&m=s">21</a> 
</td> 
</tr> 

我認爲最好的辦法是建立一個array(),使每個<tr>的唯一行,並拋出最後的代碼到list.txt文件,如:

Array (
[2] => stdClass Object (
    [name] => Djokovic, Novak 
    [country] => SRB 
    [rank] => 6,905 
) 
[3] => stdClass Object (
    [name] => Federer, Roger 
    [country] => SUI 
    [rank] => 6,795 
) 
) 

我們正在解析每個<tr>

  • [2]是從第一<td>
  • [name]一個數字是內部第二<td>
  • [country]鏈接的文本在第二<td>
  • [rank](...)之間的值是第三<td>
  • 內的鏈接的文本

在最終文件list.txt應該包含一個array()約100 IDS(我們抓住了前100名球員的網頁)。

此外,將是驚人的,如果我們將其添加到之前爲每個[name]一個小補丁的array() - 「費德勒,羅傑」應轉換爲「費德勒」(正好趕上逗號之前的字,把它扔到線的盡頭)。

謝謝。

+0

可能的重複[如何從正則表達式獲取字符串?](http://stackoverflow.com/questions/3298293/how-to-get-string-from-html-with-regex)和[reqular表達式問題在PHP](http://stackoverflow.com/questions/3382244/reqular-expression-problem-in-php/3382359#3382359)和[一對夫婦](http://stackoverflow.com/search?q= html + dom + php) - 注意這不是建議你應該使用Regex,而是建議的DOM解決方案。 – Gordon 2010-08-09 13:38:12

+0

@戈登 - 這個話題非常不同 – James 2010-08-09 13:39:36

+1

不,它沒有什麼不同。您正在詢問如何從網頁獲取特定節點或節點集。這是通過DOM解析器和XPath完成的,上面的三個鏈接中有很多示例。他們唯一不會告訴你的是如何應用你所要求的名稱修復。 – Gordon 2010-08-09 13:42:02

回答

1

SimpleHTMLDOM會讓你很容易。

前幾行會看起來像這樣(未經):

// Create DOM from URL or file 
$html = file_get_html('http://www.atpworldtour.com/Rankings/Singles.aspx'); 

// Find all images 
foreach($html->find('table[id=bioTableAlt] tr[class!=bioTableHead]') as $element) 
    { 

    } 

(不知道的tr[class!=bioTableHead],如果它不工作,嘗試一個簡單的tr

+0

將嘗試,實際上我只想要文字和圖像。 – James 2010-08-09 13:32:06

+2

建議使用DOM代替字符串解析的第三方替代方案:[phpQuery](http://code.google.com/p/phpquery/),[Zend_Dom](http://framework.zend.com/manual/) en/zend.dom.html),[QueryPath](http://querypath.org/)和[FluentDom](http://www.fluentdom.org)。 – Gordon 2010-08-09 13:32:39

+0

@戈登一如既往,你完全有一個觀點。以前沒有看過phpQuery,看起來它可能成爲我的新寵:) – 2010-08-09 13:34:30

2

下面是如何用PHP的原生DOM擴展來完成。它應該讓你到達你想去的地方。

該頁面在HTML有效性方面相當破碎,這使得加載DOM有點棘手。通常,您可以使用load()直接加載頁面。但由於HTML非常破碎,我首先將頁面加載到一個字符串中,並使用loadHTML方法代替,因爲它可以更好地處理破碎的HTML。

此外,該頁面上只有一張表:排名表。當頁面加載後,記分板通過Ajax加載,所以當您使用PHP加載時,它們的HTML不會顯示在源代碼中。所以你可以簡單地抓住所有TR元素並迭代它們。

libxml_use_internal_errors(TRUE); 
$dom = new DOMDocument; 
$dom->loadHTML(
    file_get_contents('http://www.atpworldtour.com/Rankings/Singles.aspx')); 
libxml_clear_errors(); 

$rows = $dom->getElementsByTagName('tr'); 
foreach($rows as $row) { 
    foreach($row->childNodes as $cell) { 
     echo trim($cell->nodeValue); 
    } 
} 

這將輸出所有表格單元格內容。將它們添加到數組和/或將它們寫入文件應該是微不足道的。

+1

感謝您的時間。 – James 2010-08-09 14:34:48