2010-08-09 6 views
1

Voulez-vous saisir la liste des joueurs de http://www.atpworldtour.com/Rankings/Singles.aspxPHP page externe

Il y a une table avec classe "bioTableAlt", nous devons saisir toutes les <tr> après la première (classe "bioTableHead"), qui sert à en-tête de table.

contenu voulu ressemble à:

<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> 

Je pense que la meilleure idée est de créer un array(), faire de chaque <tr> une ligne unique et jeter le code final au fichier list.txt, comme:

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

Nous analysons chaque :

  • [2] est un nombre de premier <td>
  • [name] est du texte du lien à l'intérieur seconde <td>
  • [country] est une valeur comprise entre (...) dans la deuxième <td>
  • [rank] est le texte du lien à l'intérieur troisième <td>

Dans le fichier final list.txt devrait contenir un array() avec ~ 100 IDS (nous prenons la page avec les 100 premiers joueurs).

De plus, sera incroyable, si nous faisons un petit correctif pour chaque [name] avant de l'ajouter à un array() - « Federer, Roger » devrait être converti en « Roger Federer » (juste attraper le mot avant la virgule , jetez-le à la fin de la ligne).

Merci.

+0

duplication possible de [Comment obtenir une chaîne de HTML avec regex?] (Http://stackoverflow.com/questions/3298293/how-to-get-string-from-html-with-regex) et [expression reqular problème en php] (http://stackoverflow.com/questions/3382244/reqular-expression-problem-in-php/3382359#3382359) et [un couple d'autres] (http://stackoverflow.com/search?q= html + dom + php) - notez que ceci ne veut pas dire que vous devriez utiliser Regex, mais les solutions DOM suggérées. – Gordon

+0

@Gordon - ce sujet est très différent – James

+1

non ce n'est pas différent. Vous demandez comment extraire un noeud ou un ensemble de noeuds spécifique d'une page Web. Cela est fait avec un analyseur DOM et XPath et il y a beaucoup d'exemples dans les trois liens ci-dessus. La seule chose qu'ils ne vous diront pas est comment appliquer le correctif de nom que vous demandez. – Gordon

Répondre

1

SimpleHTMLDOM rendra cela très facile pour vous.

Les premières lignes ressemblerait à quelque chose comme ça (non testé):

// 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) 
    { 

    } 

(pas sûr du tr[class!=bioTableHead], si cela ne fonctionne pas, essayez simple tr)

+0

Va essayer, en fait je ne veux que du texte et pas d'images. – James

+2

Suggestions alternatives tierces qui utilisent réellement DOM au lieu de l'analyse de chaînes: [phpQuery] (http://code.google.com/p/phpquery/), [Zend_Dom] (http://framework.zend.com/manual/ en/zend.dom.html), [QueryPath] (http://querypath.org/) et [FluentDom] (http://www.fluentdom.org). – Gordon

+0

@Gordon vous avez tout à fait un point, comme toujours. Je n'ai pas regardé phpQuery avant, on dirait qu'il pourrait devenir mon nouveau favori :) –

2

est ci-dessous comment pour le faire avec l'extension DOM native de PHP. Cela devrait vous mener à mi-chemin là où vous voulez aller.

La page est assez cassée en termes de validité HTML et cela rend le chargement avec DOM un peu délicat. Normalement, vous pouvez utiliser load() pour charger une page directement. Mais comme le code HTML est assez brisé, j'ai d'abord chargé la page dans une chaîne et j'ai utilisé la méthode loadHTML à la place, car elle gère mieux le code HTML défectueux.

De plus, il n'y a qu'une seule table sur cette page: la table de classement. Les tableaux de bord sont chargés via Ajax une fois la page chargée, de sorte que leur code HTML n'apparaîtra pas dans le code source lorsque vous le chargez avec PHP. Vous pouvez donc simplement récupérer tous les éléments TR et les parcourir.

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); 
    } 
} 

Cela afficherait tous les contenus des cellules du tableau. Il devrait être trivial de les ajouter à un tableau et/ou de les écrire dans un fichier.

+1

Merci pour votre temps. – James

Questions connexes