2016-04-27 29 views
0

我是新來的蟒蛇,燒瓶和一般美麗的湯。 所以這裏是交易。我正在用Beautifulsoup從網上獲取一些數據。從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') 

當我打印cname,cyear,ceng和cengroad它的工作完美就像我想要的一樣。但現在我正試圖在燒瓶中做到這一點。而不是在sqlite3中創建數據庫,我希望它能簡單地抓取數據並將其解析爲index.html。

這是我的app.py燒瓶代碼。

# 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) 

這是我的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 %} 

​​3210

如果嘗試

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

I get what i want but only for Car name

所以如何用C做同年相同

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

或者做這樣的事情,然後分割列表?

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) 

或者我應該嘗試沒有列表和字典?我只是不想使用分貝。

感謝您的閱讀。

+0

你知道如何使類在Python工作? –

+0

沒有:(但我正在學習辛苦的方式:) –

+0

像字面意思是「學習python的硬道路」?在這個網站上的某個地方列出了所有這些指南的錯誤 –

回答

0

你就要成功了,但不是曾經在您的視圖代碼循環兩次,只是環和創建汽車數據的詞典並添加到您的列表,像這樣:

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) 

然後在你的模板:

{% 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> 

    {% for car_info in data %} 
    <tr> 
    <td> {{ car_info['name'] }} </td> 
    <td> {{ car_info['year'] }} </td> 
    <td> {{ car_info['engine'] }} </td> 
    <td> {{ car_info['mileage'] }} </td> 
    </tr> 
    {% endfor %} 

    </tbody> 
    </table> 

{% endblock %} 
+0

謝謝@Burhan Khalid,這解決了我的問題,做了我想要的。 –

0

這第二種方法應該可行,但你會以某種方式一起想組數據。

例如,而不是兩行,嘗試將它們放入一個元組中。

data.append((came, cyear)) 

然後在您的模板中,可以提取出這些值。

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

使用車用的具有字典或對象類會是更好的,更詳細的方法,但應該爲這個簡單的例子