2016-12-22 6 views
0

Ich versuche, eine Tabelle aus HTML, die nicht in der üblichen td/tr-Format und enthält Bilder und speichern Sie das Ergebnis zu übertreffen.Python Download-Tabelle und speichern in Excel

Der HTML-Code sieht wie folgt aus:

<div class="dynamicBottom"> 
<div class="dynamicLeft"> 
<div class="content_block details_block scroll_tabs" data-tab="TABS_DETAILS"> 
<div class="header_with_improve wrap"> 
<a href="/UpdateListing.html" onclick="ta.setEvtCookie('UpdateListing', 'entry-detail-moreinfo', null, 0, '/UpdateListingRedesign')"><div class="improve_listing_btn ui_button primary small">improve this entry</div></a> 
<h3 class="tabs_header">Details</h3> </div> 
<div class="details_tab"> 
<div class="table_section"> 
<div class="row"> 
<div class="ratingSummary wrap"> 
<div class="histogramCommon bubbleHistogram wrap"> 
<div class="colTitle"> 
Rating 
</div> 
<ul class="barChart"> 
<li> 
<div class="ratingRow wrap"> 
<div class="label part "> 
<span class="text">Location</span> 
</div> 
<div class="wrap row part "> 
<span class="rate sprite-rating_s rating_s"> <img class="sprite-rating_s_fill rating_s_fill s45" src="https://static.tacdn.com/img2/x.gif" alt="45 out of fifty points"> 
</span> 
</div> 
</div> 
<div class="ratingRow wrap"> 
<div class="label part "> 
<span class="text">Service</span> 
</div> 
<div class="wrap row part "> 
<span class="rate sprite-rating_s rating_s"> <img class="sprite-rating_s_fill rating_s_fill s45" src="https://static.tacdn.com/img2/x.gif" alt="45 out of fifty points"> 
</span> 
</div> 
</div> 
</li> 

Ich möchte den Tisch bekommen: [Ort 45 von fünfzig Punkten, Dienstleistung 45 von fünfzig Punkten]. Und speichern Sie das Ergebnis in einer Excel-Datei. Der Spaltenkopf in der Excel-Datei sollte "Standort" und die Zelle unter "45" oder "45 von 50 Punkten" angeben. Der nächste Spaltenkopf sollte "Service" und die Zelle in der unteren Zeile "45" oder "45 von 50 Punkten" angeben. Ich schaffe es, den Namen und die Bewertung für Standort zu speichern, aber die Zelle für die Dienstbewertung bleibt leer.

Mein Python-Code sieht wie folgt aus:

workbook = xlsxwriter.Workbook('File.xlsx') 
worksheet = workbook.add_worksheet() 
row=1 
col=0 
for url in urls: 
    r=requests.get(url) 
    soup=BeautifulSoup(r.content, "lxml") 

    worksheet.write('A1', 'name') 
    worksheet.write('B1', 'location') 
    worksheet.write('C1', 'service') 

    row += 1 
    name= soup.find_all("div", {"class": "LocationName"}) 
    for item in name: 
     worksheet.write_string(row, col, item.text) 
    for div in soup.find_all('div', class_="ratingRow wrap"): 
     text = div.text.strip() 
     alt = div.find('img').get('alt') 
     print(text, alt) 
     worksheet.write_string(row, col+1, alt) 

Die Druckfunktion gibt aus

Location 45 out of fifty points 
Service 45 out of fifty points 

der Konsole druckt alle Ergebnisse für Lage und Service, aber in der Excel-Tabelle nur die Bewertung für Standort erscheint, während die Zelle für die Service-Bewertung leer bleibt. Ich habe versucht, die Aufzählungsfunktion, aber dann gibt es nur ein Zeichen der Bewertung für die Position in jeder Zelle in einer Zeile in Excel, aber auch keine Ergebnisse für die Service-Bewertung angezeigt.

0 4 
1 5 
2 
3 o 
4 u 
5 t 
6 
7 o 
8 f 
9 
10 f 
11 i 
12 f 
13 t 
14 y 
15 
16 p 
17 o 
18 i 
19 n 
19 t 
20 s 

Gibt es eine Möglichkeit, Python kann sagen, die zweite Zeile im Drucktext „45 von fünfzig Punkten“ in die Zelle unter „Service“ in Excel zu speichern? Ich habe gründlich gesucht, konnte aber noch keine Lösung finden. Vielen Dank für Ihre Hilfe!

Antwort

0

Ich kann nicht verstehen, warum Sie 2 separate Schleifen haben, und ich kann nicht finden, wo die Klasse LocationName irgendwo innerhalb des HTML erscheint. Weil ich erwarte, dass Sie keine Ergebnisse dafür bekommen, würde ich erwarten, dass nichts in der ersten Schleife geschrieben wird - im Einklang mit dem, was Sie berichten. Scheint so, als würdest du text schreiben an (row, col) in der 2. Schleife.

Nach der Diskussion verwendet die erste Schleife den Namen aus anderen Daten im HTML, die nur einmal pro Seite auftritt.

Mein Vorschlag der wahrscheinlichen Überschreiben der (Zeile, Spalte + 1) Zelle zu vermeiden:

workbook = xlsxwriter.Workbook('File.xlsx') 
worksheet = workbook.add_worksheet() 
row=1 
for url in urls: 
    col=0 
    r=requests.get(url) 
    soup=BeautifulSoup(r.content, "lxml") 

    worksheet.write('A1', 'name') 
    worksheet.write('B1', 'location') 
    worksheet.write('C1', 'service') 

    row += 1 
    name= soup.find_all("div", {"class": "LocationName"}) 
    for item in name: 
     worksheet.write_string(row, col, item.text) 
    for div in soup.find_all('div', class_="ratingRow wrap"): 
     col+=1 
     text = div.text.strip() 
     alt = div.find('img').get('alt') 
     print(text, alt) 
     worksheet.write_string(row, col, alt) 
+0

Sorry, ich habe vergessen, diese Zeile in der html code'

Hotel Beispiel
' –

+0

Sorry, ich habe vergessen, diese Zeile in der html code'

Hotel Beispiel
'und der Name wird tatsächlich in die Excel-Datei gedruckt. Es lässt nur die Zelle für die Service-Bewertung leer. Kann ich irgendwie dazu kommen? Vielleicht mit einem Datenrahmen? –

+0

ok (Ich denke, ich hätte das als Kommentar hinterlassen sollen), also haben Sie Standort und Service für jedes Hotel, und Sie sind nur daran interessiert, den Alt-Text für diese in das Excel-Blatt zu bekommen. Es sieht für mich so aus, als ob du das Problem ziemlich gut isoliert gegen den xlsxwriter hast, weil du die Zeichenkette, die du schreiben willst, ausdrucken kannst. Ich kann einfach Strings in mehrere Zellen schreiben und versuche, dies selbst zu replizieren. Eine andere Sache, die Sie tun könnten, ist das Überschreiben (Zeile, Col + 1) in der 2. Schleife, und ich würde versuchen, Ihren 'col'-Wert dort als eine Debugging-Methode zu iterieren. – AlanSE

Verwandte Themen