2010-08-09 63 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