2009-03-20 11 views
2

Je suis nouveau pour les expressions régulières et des choses comme ça. Je n'ai que peu de connaissances et je pense que mon problème actuel est à leur sujet.Comment faire pour rechercher une URL sur une page

J'ai une page Web, qui contient du texte. Je veux obtenir des liens de la page Web qui sont seulement dans SPAN s qui ont class="img".

Je passe par ces étapes.

  1. saisir tous les SPAN s marqués avec le « img » classe (ce qui est l'étape difficile que je suis à la recherche)
  2. move ces SPAN s à une nouvelle variable
  3. Parse la variable pour obtenir un tableau avec les liens (Chaque SPAN a seulement 1 lien, donc ce sera facile)

J'utilise PHP, mais toute autre langue n'a pas d'importance, je cherche comment faire face à la première étape. Quelqu'un a une suggestion? Merci: D

Répondre

12

Utilisez phps DOMDocument -class en combinaison avec le DOMXPath -class pour accéder aux éléments dont vous avez besoin, comme ceci:

<?php 
$dom = new DOMDocument(); 
$dom->loadHTML(file_get_contents(' http://foo.bar ')); 
$xpath = new DOMXPath($dom);

$elements = $xpath->query("/html/body//span[@class='img']//a"); foreach ($elements as $a) { echo $a->getAttribute('href'), "\n"; }

You can learn more about the XPath Language on the W3C page.

+0

+1 Je suis d'accord, le grattage de page est beaucoup plus amusant avec l'analyse DOM que les regex. – karim79

+0

+1 bien que cela ne fonctionne que sur des documents XHTML bien formés. – vartec

+0

Merci, je savais juste comment Xpath est utile :) –

1

Un modèle comme <span.* class="img".*>([^<]*)</span> devrait fonctionne bien., en supposant que votre code ressemble à quelque chose comme

<span class="img">http://www.img.com/img.jpg</span> 
<span alt="yada" class="img">animage.png</span> 
<span alt="yada" class="img" title="still works">link.txt</span> 
<span>not an img class</span> 


<?php 

$pattern = '@<span.* class="img".*>([^<]*)</span>@i'; 

//$subject = html code above 

preg_match_all($pattern, $subject, $matches); 

print_r($matches); 

?> 
+0

cela montre la durée complète :) de toute façon que c'est un bon point de départ Je choisis de travailler avec cela parce que c'est plus sûr si ma page ne charge pas complètement: D –

+0

Je pense que $ matches [0] contiendra le match complet (par exemple ) mais $ matches [1] contiendra la première expression capturée: le bit à l'intérieur du

+0

Je vous déconseille vivement d'utiliser regex, lisez l'entrée de blog pour en savoir plus ... –

1

I'm using PHP, but any other language doesn't matter, I'm looking how to deal with the first step. Any one have a suggestion?

Nous-e-ell ...

import urllib 
from BeautifulSoup import BeautifulSoup, SoupStrainer 

html = urllib.urlopen(url).read() 
sieve = SoupStrainer(name='span', attrs={'class': 'img'}) 
tag_soup = BeautifulSoup(html, parseOnlyThese=sieve) 
for link in tag_soup('a'): 
    print link['href'] 

(c'est python, en utilisant BeautifulSoup - devrait fonctionner sur la plupart des douments, bien formé ou non).

+0

vous obtiendrez des liens de cette 'soupe' je regarderai s'il y a quelque chose de semblable en PHP c'est très utile –