2017-09-06 10 views
-2

Der folgende Code gibt leere Listen aus; Ich erwarte, dass es den Aktienkurs druckt. Jede Hilfe wird geschätzt. Vielen Dank!Webscraping in Python

import urllib.request 
import re 
companyList = ["aapl","goog","nflx"] 
for i in range(len(companyList)): 

    url = "https://finance.yahoo.com/quote/"+companyList[i]+"?p="+companyList[i] 
    htmlfile = urllib.request.urlopen(url) 
    htmltext = htmlfile.read() 
    regex = '<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="35"><!-- react-text: 36 -->()(.+?)<!-- /react-text --></span>' 
    pattern = re.compile(regex) 
    price = re.findall(pattern, str(htmltext)) 
    print(price) 
+1

ich nicht den Punkt von mehreren Abwärts Stimmen sehen, vor allem für Einsteiger SO. Vielleicht könnten Sie uns sagen, was Sie von dieser Seite extrahieren möchten. In der Zwischenzeit würde ich vorschlagen, dass Sie besser BeautifulSoup, oder eine der anderen Möglichkeiten der Umgang mit Webseiten verwenden, als Regex. Dieser Ansatz ist mit Schwierigkeiten behaftet. –

+0

Wenn Sie mir einen Kommentar senden möchten, geben Sie das '@' Zeichen ein, um ein Menü zu erhalten, und wählen Sie meinen Namen aus der Liste. –

+0

Bitte analysieren Sie nicht HTML mit Regex. Sie können diese berühmte (oder berüchtigte?) Frage und Antwort für Details sehen: https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – cddt

Antwort

0

Ich werde es für eines der Unternehmen tun. Aber ich will dein festes Versprechen, dass du niemandem erzählen wirst, dass ich dir gezeigt habe, wie man es macht.

Holen Sie eine Kopie des HTML für die Seite und speichern Sie sie lokal.

>>> import urllib.request 
>>> import re 
>>> url = 'https://finance.yahoo.com/quote/AAPL/?p=AAPL' 
>>> htmlfile = urllib.request.urlopen(url) 
>>> htmltext = htmlfile.read() 
>>> open('temp.htm', 'w').write(str(htmltext)) 
533900 

Untersuchen Sie die Seite, und kopieren und fügen Sie das Element ein, das Sie auf dieser und ähnlichen Seiten identifizieren möchten. Setzen Sie es in einen Kommentar als Referenz.

>>> # <span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="35"><!-- react-text: 36 -->161.38< 

Speichern Sie es in einer Variablen, sagen wir exp.

>>> exp = '<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="35"><!-- react-text: 36 -->161.38<' 

Vergewissern Sie sich, dass in der Zeichenfolge keine Leerzeichen enthalten sind. Wenn es dann die ganze Ketten von Rohlingen mit \ s ersetzen +

>>> exp.find(' ') 
-1 

Präfix jedes der Zeichen in der Zeichenfolge , die einen wesentlichen Einfluss auf regex mit Single ‚\‘ Zeichen.

>>> re.sub(r'[().]', lambda m: '\\'+m.group(), exp) 
'<span class="Trsdu\\(0\\.3s\\) Fw\\(b\\) Fz\\(36px\\) Mb\\(-4px\\) D\\(ib\\)" data-reactid="35"><!-- react-text: 36 -->161\\.38<' 

Zeigen Sie das Ergebnis an und untersuchen Sie es.

>>> regex = '<span class="Trsdu\\(0\\.3s\\) Fw\\(b\\) Fz\\(36px\\) Mb\\(-4px\\) D\\(ib\\)" data-reactid="35"><!-- react-text: 36 -->([^<]+)<' 

Verwenden Sie die Regex, um nach dem Zielobjekt zu suchen.

>>> re.findall(regex, str(htmltext)) 
['161.38'] 
+0

Sie haben mein Wort. Vielen Dank für die Hilfe. : D –

0

Sehen Sie, ob unten Skript kann helfen. Dies umfasst auch die Authentifizierung.

https://github.com/PraveenKandregula/JenkinsRSSScrappingWithPython/blob/master/JenkinsRSSScrappingWithPython.py