2016-07-11 17 views
0

Ich benutze Python regulären Ausdruck, um HTML-Datei zu analysieren, jetzt muss ich eine Zahl aus einem HTML-Tag extrahieren, kann die Zahl entweder Integer oder Gleitkommawert sein. Im Folgenden sind zwei Beispiele:HTML-Parsing mit Python regulären Ausdruck

integer Fall:

<span class='addr-bbs'>2 baths</span> 

Gleitkomma-Fall:

<span class='addr-bbs'>3.5 baths</span> 

Mein ursprünglicher Code ist:

bath = re.findall('<span class=\"addr_bbs\">' + '(.{1,3})' + 'baths{0,1}<', str(homedata)) 

Aber nach der Prüfung, es fehlt die ganze Gleitkomma-Fälle. Wie kann ich beide Fälle abdecken, um die Nummer korrekt zu extrahieren?

Dank

+8

Verwenden Sie Regex nicht, um HTML zu analysieren, verwenden Sie einen HTML-Parser. –

+2

Bitte analysiere HTML nicht mit Regex, es wird dich verletzen. Sie verwenden bereits Python, warum nicht BeautifulSoup verwenden? https: // www.crummy.com/software/BeautifulSoup/bs4/doc/ – 1sloc

+0

Mögliches Duplikat von [RegEx-Übereinstimmungen mit offenen Tags außer XHTML-eigenen Tags] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-inclosed-tags) –

Antwort

1

Wie kommentiert, verwenden Sie ein html parser die Tags von Klassennamen zu finden. Wenn die Zahl immer der erste im Text ist, kann man nur teilen Sie es zu extrahieren, wenn Sie den Tag haben:

from bs4 import BeautifulSoup 
h = """<span class='addr-bbs'>3.5 baths</span> 
     <span class='addr-bbs'>1 baths</span> 
     <span class='foos'>3.0 baths</span>""" 

soup = BeautifulSoup(h,"html.parser") 

for span in soup.select("span.addr-bbs"): 
    print(span.text.split()[0]) 

Welche drucken würde:

3.5 
1 

Wenn Sie auch nach dem Tag filtern wollen Text, dh es gibt andere Spannen mit der addr-bbs, können Sie eine Regex an find_all übergeben, um nur die span.addr-bbs, die das Wort haben Bäder.

from bs4 import BeautifulSoup 
import re 
h = """<span class='addr-bbs'>3.5 baths</span> 
"<span class='addr-bbs'>5 rooms</span> 
     <span class='addr-bbs'>1 baths</span> 
     <span class='foos'>3.0 baths</span>""" 

soup = BeautifulSoup(h, "html.parser") 

for span in soup.find_all("span","addr-bbs", text=re.compile(r"\bbaths\b")): 
    print(span.text.split()[0]) 
+1

Sie haben wahrscheinlich Recht, regx ist möglicherweise keine gute Idee auf lange Sicht. Ich muss das Ganze mit BeautifulSoup wiederholen. – DQI

0

Drei Fehler:

  • die Anführungsstriche;
  • der Strich;
  • der Raum.

Versuchen mit bath = re.findall('''<span class=["']addr-bbs["']>''' + '(.{1,3})' + ' baths{0,1}<', str(homedata))

0

Zuerst merkt man etwas ohne weitere Verarbeitung zum Scheitern verurteilt ist. Einige Makler schreiben "2.5", andere "2 1/2", andere "2 + 1/2" und so weiter. MLS Daten wurden nie normalisiert, zum Teil, um es schwierig zu parsen. Gerade wenn Sie denken, dass Sie es gelöst haben, erhalten Sie "2 + sinken". Es ist normalerweise zulässig, die numerische Bedeutung für Suchen zu erraten und dann den ursprünglichen Text auszuspucken, wenn er angezeigt wird.

Sie sollten wahrscheinlich alles von der > bis baths greifen. Um dies richtig zu machen, sollten Sie die "nicht-gierige" Modifikation verwenden, so dass Sie nicht bis zum nächsten Datensatz analysieren. Sie können in Thsi Python doc nicht gierige lesen, aber das Zauberwort ist:

bath = re.findall('<span class=\"addr_bbs\">(.*?)bath.?<', str(homedata))

Dann versuchen bath.groups zu analysieren() gut Sie können.