2016-04-27 10 views
0

Ich bin neu zu Python, Kolben und schöne Suppe im Allgemeinen. Also hier ist der Deal. Ich schabe einige Daten aus dem Internet mit Beautifulsoup.Parsing List oder dict zu Flask von Beautifulsoup

from bs4 import BeautifulSoup 
    import requests 

    # PageURL's configure 
    mainpage = 'http://www.myauto.ge/' 
    pageurl = 'http://www.myauto.ge/?action=search&page=' 
    pagenum = 0 

    # Looping Pages. Seems Wrong but doing its job? 
    for x in range(0, 2): 
     pagenum += 1 
     r = requests.get(pageurl + str(pagenum)) 
     soup = BeautifulSoup(r.content, 'html.parser') 

     for cars in soup.find_all('div', {'class': 'car-info-wrapper'}): 

      cname = cars.find("div", {"class": "car-name-wrapper"}).find('a').get_text() 
      cyear = cars.find("p", {"class": "cr-levy car-year"}).get_text() 
      ceng = cars.find("div", {"class": "cr-det-in cr-engine"}).p.get_text() 
      cengroad = cars.find("div", {"class": "cr-det-in cr-road"}).p.get_text() 
      # clink = cars.find('a').get('href') 

, wenn ich drucken cname, cyear, ceng und cengroad seine seine Arbeit perfekt zu tun, wie ich es will. aber jetzt versuche ich das in flaschen zu machen. Anstatt eine Datenbank in sqlite3 zu erstellen, möchte ich, dass sie einfach Daten scrappt und sie in index.html parst.

dies ist mein app.py flaschen code.

# Import 
from flask import Flask, render_template 
import requests 
from bs4 import BeautifulSoup 


app = Flask(__name__) 

# mainpage = 'http://www.myauto.ge/' 
pageurl = 'http://www.myauto.ge/?action=search&page=' 
# pagenum = 0 



# Our index 
@app.route('/') 
@app.route('/index') 
def index(): 
    # for x in range(0, 2): 
    #  pagenum += 1 
    r = requests.get(pageurl) 
    soup = BeautifulSoup(r.content, 'html.parser') 

    data = [] 
    for cars in soup.find_all('div', {'class': 'car-info-wrapper'}): 
     cname = cars.find("div", {"class": "car-name-wrapper"}).find('a').get_text() 

     data.append(cname) 

    datayear =[] 
    for cars in soup.find_all('div', {'class': 'car-info-wrapper'}): 
     cyear = cars.find("p", {"class": "cr-levy car-year"}).get_text() 
     datayear.append(cyear) 


    return render_template("index.html", data=data,datayear=datayear) 




if __name__ == '__main__': 
    app.run(debug=True) 

das ist mein index.html

{% extends "base.html" %} 
{% block body %} 
<table class="table"> 
    <thead> 
     <tr> 
     <th>Car</th> 
     <th>Year</th> 
     <th>Engine</th> 
     <th>Road so far</th> 
     </tr> 
    </thead> 
    <tbody> 

    <tr> 
    <td> {{ data }} </td> 
    <td> {{ datayear }} </td> 
    </tr> 


    </tbody> 
    </table> 

{% endblock %} 

and this is what i get

versuchen, wenn zu

<tr> 
    {% for x in data %} 
    <td> {{ x }} </td> 
    <td>   </td> 
    </tr> 

I get what i want but only for Car name

so, wie es mit C zu tun ein Jahr das gleiche

<tr> 
    {% for x in data %} 
    <td> {{ carname }} </td> 
    <td> {{ caryear }} </td> 
    </tr> 

oder etwas tun und dann Split-Liste?

data = [] 
for cars in soup.find_all('div', {'class': 'car-info-wrapper'}): 
    cname = cars.find("div", {"class": "car-name-wrapper"}).find('a').get_text() 
    cyear = cars.find("p", {"class": "cr-levy car-year"}).get_text() 

    data.append(cname) 
    data.append(cyear) 

oder sollte ich es ohne Liste und dict versuchen? Ich möchte nur nicht db verwenden.

Danke fürs Lesen.

+0

Wissen Sie, wie Klassen in Python zu machen? –

+0

nein :(aber ich lerne den harten Weg :) –

+0

Wie wörtlich "lernen Python den harten Weg"? Es gibt irgendwo auf dieser Seite, die alle Dinge auflistet, die mit diesen Guides falsch sind. –

Antwort

0

Sie sind fast da, sondern zweimal in der Ansicht Code, nur Schleife einmal von looping und ein Wörterbuch der Fahrzeugdaten erstellen und zu Ihrer Liste hinzufügen, wie folgt aus:

data = [] 
for cars in soup.find_all('div', {'class': 'car-info-wrapper'}): 
    car_info = {} # Start with an empty dictionary for each car. 

    car_info['name'] = cars.find("div", {"class": "car-name-wrapper"}).find('a').get_text() 
    car_info['year'] = cars.find("p", {"class": "cr-levy car-year"}).get_text() 
    car_info['engine'] = cars.find("div", {"class": "cr-det-in cr-engine"}).p.get_text() 
    car_info['mileage'] = cars.find("div", {"class": "cr-det-in cr-road"}).p.get_text() 

    data.append(car_info) 

return render_template("index.html", data=data) 

Dann in Ihrem Vorlage:

+0

Dank dir @Burhan Khalid, Das löste mein Problem und tat, was ich wollte. –

0

Dieser zweite Ansatz sollte funktionieren, aber Sie möchten die Daten in irgendeiner Weise zusammen gruppieren.

Zum Beispiel, anstatt zwei Zeilen, versuchen Sie, sie in ein Tupel zu setzen.

data.append((came, cyear)) 

Dann können Sie in Ihrer Vorlage diese Werte extrahieren.

{% for x in data %} 
<tr> 
    <td> {{ x[0] }} </td> 
    <td> {{ x[1] }} </td> 
</tr> 
{% endfor %} 

Mit einem Wörterbuch oder Objektklasse für ein Auto wäre, desto besser, ausführlicher Ansatz sein, aber das sollte für dieses einfache Beispiel arbeitet

Verwandte Themen