2016-07-03 11 views
0

Ich habe vor kurzem versucht, Informationen von einer Website zu ziehen, und während ich größtenteils erfolgreich war, war es ein bisschen ein Kampf.Versuchen, Daten von einer schlecht formatierten HTML-Website zu ziehen

Ich habe zur Zeit Regex benutzen einige Informationen zu finden (hier die Namen, die ich will, betrachten)

webAddress = 'http://meridian.puzzlepirates.com/yoweb/crew/info.wm?crewid=' + str(crewid) 
htmlFile = urllib.urlopen(webAddress) 
htmlText = htmlFile.read() 

regex = 'classic&target=(.+?)">' 
pattern = re.compile(regex) 
checkMatch = re.findall(pattern,htmlText) 

Wie so. Das funktioniert, wenn in dieser Zeile ein konsistenter Indikator vorhanden ist. Allerdings habe ich jetzt ein Problem, bei dem mein Indikator nicht in dieser Zeile steht.

<td width="28" height="28"><a href="/ratings/top_5_0.html"><img 
    src="/yoweb/images/stat-5.png" width="28" height="28" border="0" 
    alt="Gunning"></a></td> 
<td align="left"> 
    <font size="-1"> 
     <i><b>Exalted</b></i>/<b>Master</b> 
    </font> 

Insbesondere sucht die vorletzte Zeile zu ziehen, aber es ist möglich, dass diese zweite bis letzte Zeile ist nicht fett gedruckt oder Kursiv/haben nicht die gleichen Worte, so eine Art mein Indikator "sein muss Gunning "weil das ist der spezifische Bereich, der mir wichtig ist. Leider ist es nicht immer in der gleichen Zeile auf einer anderen Seite, daher kann ich nicht einfach eine bestimmte Zeile ansehen, um zu versuchen, sie zu finden. Irgendwelche Vorschläge wären großartig!

EDIT

ich zum Start eingeschaltet haben, um zu versuchen Schöne Suppe zu lernen/verwenden (danke für mich zeigen in diese Richtung.

war ich nicht so klar, wie ich zuerst sein soll, so lassen Sie mich versuchen zu klären.

Insbesondere versuchen, die Reihen von einer Seite wie this

<td width="28" height="28"><a href="/ratings/top_5_0.html"><img 
    src="/yoweb/images/stat-5.png" width="28" height="28" border="0" 
    alt="Gunning"></a></td> 
<td align="left"> 
    <font size="-1"> 
     <i><b>Exalted</b></i>/<b>Master</b> 
    </font> 

, die der HTML-Code des Abschnitts zu ziehen, dass ich Ich suche speziell nach oben und nicht immer in der gleichen Formatierung (zB kann es nicht fett, fett oder fett und kursiv sein. Also nicht wirklich sicher, welche Methode ich verwenden könnte, um einen bestimmten Wert zuverlässig aus dieser Information zu ziehen.

Ich habe versucht, über Schriftgröße zu isolieren, aber die Anzahl der Ergebnisse ist nicht konsistent und das kann ich nicht isolieren den spezifischen stat ich will.

+0

Mögliches Duplikat [Regex offen Tags außer XHTML self-contained tags] (http: // Stackoverflow .com/questions/1732348/regex-match-open-tags-exception-xhtml-autocontained-tags) – rohithpr

+0

Parsen Sie xml/html nicht mit einer Regex. – Sumurai8

Antwort

2

Die Markup ist definitiv nicht einfach zu behandeln, aber Sie sind definitiv should not be approaching it with regular expressions. Verwenden Sie kein Werkzeug, nur weil es Ihnen vertraut ist oder Sie damit vertraut sind. Verwenden Sie ein Werkzeug, das in einem bestimmten Fall am besten geeignet ist. In diesem Fall benötigen Sie einen HTML-Parser, wie BeautifulSoup.

Angenommen, Sie die Namen extrahieren möchten (die Namen in Fettdruck in der Haupt Crew Tabelle):

>>> import requests 
>>> from bs4 import BeautifulSoup 
>>> url = "http://meridian.puzzlepirates.com/yoweb/crew/info.wm?crewid=5002373" 
>>> 
>>> response = requests.get(url) 
>>> 
>>> soup = BeautifulSoup(response.content, "html.parser") 
>>> table = soup.find('table', width='330') # relying on width, yeah, does not look reliable 
>>> for b in table.find_all('b'): 
...  print(b.get_text(strip=True)) 
... 
Captain 
Senior Officer 
Fleet Officer 
Officer 
Pirate 
Cabin Person 
Jobbing Pirate 
+0

Danke für die Hilfe, nicht 100% was ich speziell suchte, aber Beautiful Soup scheint definitiv das viel mächtigere Werkzeug. Ich habe die Hauptfrage mit einigen Klarstellungen bearbeitet. –

+0

Ah ich fand die Lösung. Es stellte sich heraus, dass ich nach Schriftgröße suchen und rückwärts zählen konnte, da das Ende der generierten Listen jedes Mal dasselbe war. –

Verwandte Themen