Regex nei tag html

Vorrei analizzare il prezzo HD dal seguente snipper di HTML. Ho solo frammenti del codice html, quindi non posso usare un parser HTML per questo.

View In iTunes £19.99
  • HD Version

Fondamentalmente, il formato sarebbe “Trova il prezzo prima della parola” Versione HD “(senza distinzione tra maiuscole e minuscole). Ecco cosa ho finora:

 re.match(r'^(\d|.){1,6}...HD\sVersion', string) 

Come estrarre il valore “19.99” dalla stringa sopra?

BeautifulSoup è molto clemente dell’HTML che analizza, puoi usarlo anche per i pezzi / parti dell’HTML:

 # -*- coding: utf-8 -*- from bs4 import BeautifulSoup data = u""" 
View In iTunes £19.99
  • HD Version
  • """ soup = BeautifulSoup(data) print soup.find('span', class_='price').text[1:]

stampe:

 19.99 

Hai richiesto un’espressione regolare qui, ma non è lo strumento giusto per analizzare l’HTML. Usa BeautifulSoup per questo.

 >>> from bs4 import BeautifulSoup >>> html = ''' 
View In iTunes £19.99
  • HD Version
  • ''' >>> soup = BeautifulSoup(html) >>> val = soup.find('span', {'class':'price'}).text >>> print val[1:] 19.99

È ancora ansible analizzare utilizzando BeautifulSoup , non è necessario l’html completo:

 from bs4 import BeautifulSoup html=""" 
View In iTunes £19.99
  • HD Version
  • """ soup = BeautifulSoup(html) sp = soup.find(attrs={"class":"price"}) print sp.text[1:] 19.99

Le attuali risposte di BeautifulSoup mostrano solo come afferrare tutti i . Questo è meglio:

 from bs4 import BeautifulSoup soup = """
View In iTunes £19.99
  • HD Version
  • """ for HD_Version in (tag for tag in soup('li') if tag.text.lower() == 'hd version'): price = HD_Version.parent.findPreviousSibling('span', attrs={'class':'price'}).text

In generale, l’utilizzo di espressioni regolari per analizzare un linguaggio irregolare come HTML richiede problemi. Rimani con un parser stabilito.

Puoi usare questa regex:

 \d+(?:\.\d+)?(?=\D+HD Version) 
  • \D+ salta in avanti senza cifre in avanti, affermando efficacemente che la nostra partita ( 19.99 ) è l’ultima cifra prima della HD Version .

Ecco una demo regex .

Utilizza il modificatore i nella regex per rendere la distinzione tra maiuscole e minuscole e cambia + su * se il numero può essere direttamente prima della HD Version .