2016-07-19 10 views
1

Ich gehe gerade durch den Web Scraping-Bereich von AutomateTheBoringStuff und versuche, ein Skript zu schreiben, das übersetzte Worte aus Google Translate mit BeautifulSoup4 extrahiert.BeautifulSoup4 mit Google Translate verwenden

besichtigte ich den HTML-Inhalt einer Seite, wo ‚Erklärung‘ das übersetzte Wort ist:

<span id="result_box" class="short_text" lang="en"> 
    <span class>Explanation</span> 
</span> 

BeautifulSoup4 benutzen, habe ich versucht, verschiedene Selektoren, aber nichts, um das übersetzte Wort zurückkehren würde. Hier sind ein paar Beispiele, die ich versucht, aber sie kehren überhaupt keine Ergebnisse:

soup.select('span[id="result_box"] > span') 
soup.select('span span') 

Ich kopierte sogar die Wähler direkt von den Developer Tools, die gab mir #result_box> Spanne. Dies liefert wiederum keine Ergebnisse.

Kann mir jemand erklären, wie BeautifulSoup4 für meinen Zweck verwendet werden kann? Dies ist mein erstes Mal mit BeautifulSoup4 aber ich denke, ich bin mit BeautifulSoup mehr oder weniger korrekt, weil die Wähler

soup.select('span[id="result_box"]') 

wird mir das äußere Element span **

[<span class="short_text" id="result_box"></span>] 

** Nicht sicher, warum die ' leng = "en" 'Teil fehlt, aber ich bin mir ziemlich sicher, dass ich das richtige Element trotzdem gefunden habe.

ist der komplette Code:

import bs4, requests 

url = 'https://translate.google.ca/#zh-CN/en/%E6%B2%BB%E5%85%B7' 
res = requests.get(url) 
res.raise_for_status 
soup = bs4.BeautifulSoup(res.text, "html.parser") 
translation = soup.select('#result_box span') 
print(translation) 

EDIT: Wenn ich die Google übersetzen als Offline-HTML-Datei speichern und dann aus dieser HTML-Datei eine Suppe Objekt macht, wäre es kein Problem, die Ortung sein Element.

import bs4 

file = open("Google Translate.html") 
soup = bs4.BeautifulSoup(file, "html.parser") 
translation = soup.select('#result_box span') 
print(translation) 
+0

unterstützt Ihr Code ist in Ordnung, das Problem ist dynamisch generierten Inhalt, die Übersetzung ist nicht verfügbar in der Quelle, die Sie zurück erhalten. –

Antwort

1

Der result_box div ist das richtige Element, aber Ihr Code funktioniert nur, wenn Sie speichern, was Sie in Ihrem Browser sehen, als dass die dynamisch generierte Inhalte enthalten, unter Verwendung von fordert Sie auf, nur die Quelle selbst jeden dynamisch generierten Inhalt zu sperren. Die Übersetzung wird von einem Ajax-Aufruf an die unten angegebene URL generiert:

"https://translate.google.ca/translate_a/single?client=t&sl=zh-CN&tl=en&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=bh&ssel=0&tsel=0&kc=1&tk=902911.786207&q=%E6%B2%BB%E5%85%B7" 

Für Ihre Anfragen es gibt:

[[["Fixture","治具",,,0],[,,,"Zhì jù"]],,"zh-CN",,,[["治 具",1,[["Fixture",999,true,false],["Fixtures",0,true,false],["Jig",0,true,false],["Jigs",0,true,false],["Governance",0,true,false]],[[0,2]],"治具",0,1]],1,,[["ja"],,[1],["ja"]]] 

So müssen Sie entweder die Anfrage zu imitieren, alle notwendigen Parameter oder Verwendung vorbei etwas, das dynamische Inhalte wie selenium

+0

Danke für die Antwort. Ich denke, ich werde den Code stattdessen mit Selen umschreiben. Ich habe jedoch eine Frage an Sie: Woher wussten Sie, dass der Inhalt dynamisch generiert wurde? –

+0

@ken, der einfachste Weg ist, mit der rechten Maustaste und wählen Sie die Ansicht Quelle, was Sie dort sehen, ist, was Anfragen abrufen wird. –

+0

Ich sehe, das wird sehr nützlich sein, wenn ich Anfragen in der Zukunft verwende. Eine kleine Frage: Zählt der dynamisch generierte Inhalt immer noch als HTML-Inhalt? –

0

Ganz einfach versuchen:

translation = soup.select('#result_box span')[0].text 
print(translation) 
+1

Hallo, die Verwendung gibt mir den Fehler " IndexError: Liste Index außerhalb des Bereichs", die ich glaube, weil es kein Ergebnis in der Übersetzung gab und somit die Übersetzung [0] nicht gültig ist. –

+0

entfernen Sie "html.parser" und versuchen Sie dann –

+1

Hallo, das wurde verwendet, um ein UserWarning von bs4 zu entfernen. Egal, ich entfernte es, aber der gleiche Fehler tauchte auf. Ich habe auch meinen Beispielcode zu einer vollständigen, geschrumpften Version bearbeitet, damit andere Benutzer das Debugging ausprobieren können. Wenn Sie also diesen Code reparieren und auf Ihrem eigenen Computer verifizieren könnten, wäre das großartig! –