Domanda

Sono nuovissimo in Python e ho bisogno di aiuto con la sintassi per trovare e iterare attraverso i tag HTML usando lxml. Ecco i casi d'uso di cui mi sto occupando:

Il file HTML è abbastanza ben formato (ma non perfetto). Ha più tabelle sullo schermo, una contenente una serie di risultati di ricerca e una per intestazione e piè di pagina. Ogni riga del risultato contiene un collegamento per i dettagli del risultato della ricerca.

  1. Devo trovare la tabella centrale con le righe dei risultati della ricerca (questa sono stata in grado di capire):

        self.mySearchTables = self.mySearchTree.findall(".//table")
        self.myResultRows = self.mySearchTables[1].findall(".//tr")
    
  2. Devo trovare i collegamenti contenuti in questa tabella (è qui che mi blocco):

        for searchRow in self.myResultRows:
            searchLink = patentRow.findall(".//a")
    

    Non sembra effettivamente individuare gli elementi del collegamento.

  3. Ho bisogno del semplice testo del link. Immagino che sarebbe qualcosa come searchLink.text se in realtà avessi gli elementi di collegamento in primo luogo.

Infine, nell'effettivo riferimento API per lxml, non sono riuscito a trovare informazioni sulle chiamate find e findall. Ho raccolto questi da frammenti di codice che ho trovato su Google. Mi sto perdendo qualcosa su come trovare e iterare in modo efficace sui tag HTML usando lxml?

È stato utile?

Soluzione

Va ??bene, innanzitutto, per quanto riguarda l'analisi dell'HTML: se segui la raccomandazione di zweiterlinde e S.Lott almeno usa la versione di beautifulsoup incluso con lxml . In questo modo otterrai anche il vantaggio di una bella interfaccia selettore xpath o css.

Tuttavia, preferisco personalmente il parser HTML di Ian Bicking incluso in lxml .

In secondo luogo, .find () e .findall () provengono da lxml cercando di essere compatibili con ElementTree, e questi due metodi sono descritti in Supporto XPath in ElementTree .

Queste due funzioni sono abbastanza facili da usare ma sono XPath molto limitate. Consiglio di provare a utilizzare il metodo lxml completo xpath () o, se hai già familiarità con i CSS, utilizzando cssselect () metodo .

Ecco alcuni esempi, con una stringa HTML analizzata in questo modo:

from lxml.html import fromstring
mySearchTree = fromstring(your_input_string)

Usando la classe del selettore css il tuo programma sarebbe simile a questo:

# Find all 'a' elements inside 'tr' table rows with css selector
for a in mySearchTree.cssselect('tr a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

L'equivalente usando il metodo xpath sarebbe:

# Find all 'a' elements inside 'tr' table rows with xpath
for a in mySearchTree.xpath('.//tr/*/a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

Altri suggerimenti

C'è un motivo per cui non stai usando Beautiful Soup per questo progetto? Renderà molto più semplice la gestione di documenti formati in modo imperfetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top