2015-03-02 43 views
1

Python初學者在這裏首先嚐試使用CSV模塊導出刮擦結果。有問題的腳本返回幾個表格元素,只對每個退貨產品的「價格」和「生產率」感興趣。基本上只需要2列這些各自的元素。將美麗的湯表導出爲CSV格式

我敢肯定,當我試圖寫入一個csv時,我正在做一些根本性的錯誤,只是不知道是什麼。我的桌面上有一個空的.csv文件,名爲「test」,我正試圖將所有內容寫入,而且我試圖將相同格式的其他「寫入csv」示例複製到SE上無濟於事。任何輸入讚賞。

from bs4 import BeautifulSoup 

import csv 
import requests 

csvfile = "test.csv" 
url = "http://www.dabs.com/category/computing/11001" 
base_url = "http://www.dabs.com" 
page_array = [] 

html = requests.get(url) 
soup = BeautifulSoup(html.content, "html.parser") 
Product_table = soup.findAll("table") 
Products = Product_table[0].findAll("tr") 

if len(soup.findAll('tr')) > 0: 
    Products = Products[1:] 

for row in Products: 
    cells = row.find_all('td') 
    data = { 
     'description' : cells[0].get_text(), 
     'price' : cells[1].get_text() 
    } 
    print row 

with open(csvfile, row) as csvfile: 
    link_writer = csv.writer(csvfile) 
    for val in row: 
     link_writer.writerow(val) 

回答

2

您需要打開寫未能通過迭代:

with open(csvfile, "w") as csvfile: # w opens for writing 

如果你想寫從你的循環項目,你應該外面打開,並在循環寫:

with open(csvfile, "w") as csvfile: 
    link_writer = csv.writer(csvfile) 
    for row in Products: 
     cells = row.find_all('td') 
     data = { 
      'description' : cells[0].get_text(), 
      'price' : cells[1].get_text() 
     } 
     # write what you need 

你的代碼也找不到,找到數量和價格:

html = requests.get(url) 
soup = BeautifulSoup(html.content, "html.parser") 
product_table = soup.find("table") 
tds = product_table.find_all('td') 


with open(csvfile, "w") as csvfile: 
    link_writer = csv.writer(csvfile) 
    for tag in tds: 
     mfr = tag.find("span") 
     if mfr: 
      print(mfr.text) 

Mfr#: FK3-UK 
£30.00 
Mfr#: PDW0AE-00900PEN 
£99.99 
Mfr#: FORCE K7 
£39.99 
Mfr#: X551MAV-BING-SX1017B 
£229.99 
Mfr#: VE228TR 
£79.99 
Mfr#: QQ2-00038 
£59.94 
Mfr#: M6900 
£18.00 
Mfr#: MCB4370500C2/04/1 
£51.39 
Mfr#: 79G-03549 
£94.99 
Mfr#: FQC-08289 
£113.18 
Mfr#: WN7-00614 
£76.32 
Mfr#: GFC-02733 
£69.99 
Mfr#: 2LF-00021 
£19.78 
Mfr#: T5D-01574 
£169.72 
Mfr#: X555LA-XX273H 
£399.99 
Mfr#: FQC-06949 
£109.99 
Mfr#: 10DR000TUK 
£279.99 
Mfr#: 10AW008NUK 
£268.44 
Mfr#: MCF3QUK 
£179.98 
Mfr#: K3X03EA#ABU 
£253.45 
Mfr#: 10DR001EUK 
£348.82 
Mfr#: 9H.LA2LB.DPE 
£76.41 
Mfr#: 51MF1600AA001 
£29.98 
Mfr#: G7V83EA REFURB 
£199.99 
Mfr#: 62151 
£27.99 

所以創建具有MFR-NR爲重點,價格爲值的字典:

product_table = soup.find("table") 
tds = product_table.find_all('td') 

data = [] 
for tag in tds: 
    mfr = tag.find("span") 
    if mfr: # make sure we have test to get 
     data.append(mfr.text) 

it = iter(data) # create iterator 
# will create key/value pairings by getting every second element as key and every second element as value starting from 0 and 1 respectively. 
data_dict = dict(zip(it, it)) 

print(data_dict) 
{'Mfr#: FQC-08289': '£113.18', 'Mfr#: 62151': '£27.99', 'Mfr#: VE228TR': '£79.99', 'Mfr#: GFC-02733': '£69.99', 'Mfr#: FK3-UK': '£30.00', 'Mfr#: WN7-00614': '£76.32', 'Mfr#: 10DR001EUK': '£348.82', 'Mfr#: 51MF1600AA001': '£29.98', 'Mfr#: FORCE K7': '£39.99', 'Mfr#: 10DR000TUK': '£279.99', 'Mfr#: 2LF-00021': '£19.78', 'Mfr#: M6900': '£18.00', 'Mfr#: T5D-01574': '£169.72', 'Mfr#: MCB4370500C2/04/1': '£51.39', 'Mfr#: 10AW008NUK': '£268.44', 'Mfr#: PDW0AE-00900PEN': '£99.99', 'Mfr#: G7V83EA REFURB': '£199.99', 'Mfr#: 79G-03549': '£94.99', 'Mfr#: K3X03EA#ABU': '£253.45', 'Mfr#: FQC-06949': '£109.99', 'Mfr#: X551MAV-BING-SX1017B': '£229.99', 'Mfr#: X555LA-XX273H': '£399.99', 'Mfr#: QQ2-00038': '£59.94', 'Mfr#: MCF3QUK': '£179.98', 'Mfr#: 9H.LA2LB.DPE': '£76.41'} 

最後寫入CSV:

with open(csvfile, "w") as csvfile: 
    link_writer = csv.writer(csvfile) 
    for tup in data_dict.items(): 
     link_writer.writerow(tup) # write key and value mfr/price in each column 

,它輸出以下內容:

Mfr#: 10DR001EUK,£348.82 
Mfr#: WN7-00614,£76.32 
Mfr#: FQC-06949,£109.99 
Mfr#: 2LF-00021,£19.78 
Mfr#: MCB4370500C2/04/1,£51.39 
Mfr#: PDW0AE-00900PEN,£99.99 
Mfr#: GFC-02733,£69.99 
Mfr#: G7V83EA REFURB,£199.99 
Mfr#: X555LA-XX273H,£399.99 
Mfr#: FK3-UK,£30.00 
Mfr#: QQ2-00038,£59.94 
Mfr#: T5D-01574,£169.72 
Mfr#: 51MF1600AA001,£29.98 
Mfr#: 62151,£27.99 
Mfr#: FQC-08289,£113.18 
Mfr#: K3X03EA#ABU,£253.45 
Mfr#: VE228TR,£79.99 
Mfr#: 9H.LA2LB.DPE,£76.41 
Mfr#: 10DR000TUK,£279.99 
Mfr#: FORCE K7,£39.99 
Mfr#: X551MAV-BING-SX1017B,£229.99 
Mfr#: 10AW008NUK,£268.44 
Mfr#: MCF3QUK,£179.98 
Mfr#: 79G-03549,£94.99 
Mfr#: M6900,£18.00 

如果你不想在輸出中使用Mfr#:部分,只需使用str.split:

data = [] 
for tag in tds: 
    mfr = tag.find("span") 
    if mfr: 
     data.append(mfr.text.split(":")[-1].strip()) 

那麼您的CSV會再看看這樣的:

FK3-UK,£30.00 
2LF-00021,£19.78 
G7V83EA REFURB,£199.99 
T5D-01574,£169.72 
FQC-06949,£109.99 
10DR001EUK,£348.82 
FQC-08289,£113.18 
M6900,£18.00 
10DR000TUK,£279.99 
VE228TR,£79.99 
WN7-00614,£76.32 
62151,£27.99 
MCF3QUK,£179.98 
FORCE K7,£39.99 
51MF1600AA001,£29.98 
X551MAV-BING-SX1017B,£229.99 
GFC-02733,£69.99 
9H.LA2LB.DPE,£76.41 
79G-03549,£94.99 
QQ2-00038,£59.94 
PDW0AE-00900PEN,£99.99 
K3X03EA#ABU,£253.45 
MCB4370500C2/04/1,£51.39 
10AW008NUK,£268.44 
X555LA-XX273H,£399.99 
+0

這是驚人的!感謝您使它真的很清楚。 – user3093445 2015-03-04 21:27:32

+0

@ user3093445,沒有問題。在解析時總會有幾種不同的方式來獲得你所需要的東西,試圖在一個步驟中獲取相關值始終是最好的方法,如果可能的話,以便正確排列。 – 2015-03-04 21:29:00