2010-01-18 3 views
5

Ho questa query XPath:Come estrarre i link da una pagina Web usando lxml, XPath e Python?

/html/body//tbody/tr[*]/td[*]/a[@title]/@href 

Estrae tutti i link con l'attributo title - e dà la href in FireFox's Xpath checker add-on.

Tuttavia, non riesco a usarlo con lxml.

from lxml import etree 
parsedPage = etree.HTML(page) # Create parse tree from valid page. 

# Xpath query 
hyperlinks = parsedPage.xpath("/html/body//tbody/tr[*]/td[*]/a[@title]/@href") 
for x in hyperlinks: 
    print x # Print links in <a> tags, containing the title attribute 

Questo non produce alcun risultato da lxml (elenco vuoto).

Come si prende il testo href (collegamento) di un collegamento ipertestuale contenente il titolo dell'attributo con lxml in Python?

+0

Il documento che si sta analizzando ha uno spazio dei nomi (xmlns) impostato? –

risposta

9

sono stato in grado di farlo funzionare con il seguente codice:

from lxml import html, etree 
from StringIO import StringIO 

html_string = '''<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

<html lang="en"> 
<head/> 
<body> 
    <table border="1"> 
     <tbody> 
     <tr> 
      <td><a href="http://stackoverflow.com/foobar" title="Foobar">A link</a></td> 
     </tr> 
     <tr> 
      <td><a href="http://stackoverflow.com/baz" title="Baz">Another link</a></td> 
     </tr> 
     </tbody> 
    </table> 
</body> 
</html>''' 

tree = etree.parse(StringIO(html_string)) 
print tree.xpath('/html/body//tbody/tr/td/a[@title]/@href') 

>>> ['http://stackoverflow.com/foobar', 'http://stackoverflow.com/baz'] 
2

Firefox adds additional html tags al codice HTML quando si esegue il rendering, rendendo il XPath restituito dallo strumento piromane in contrasto con il codice HTML effettivo restituito dal server (e cosa restituirà urllib/2).

La rimozione del tag <tbody> generalmente fa il trucco.