2014-04-10 52 views
1

我正在編寫一個程序以從網站中提取文本並將其寫入文本文件。文本文件中的每個條目應具有3個由製表符分隔的值。第一個值是硬編碼爲XXXX,第二個值應該初始化爲網站上的第一個項目,第三個值是網站上的下一個項目,其中a。我試圖介紹的邏輯是查找第一個並將相關字符串寫入文本文件。然後找到下一個並將關聯的字符串寫入文本文件。 然後,找到下一個p類。如果是「style4」,則開始一個新行,如果是另一個「style5」,則將其寫入帶有第一個style5條目的文本文件中,但用逗號分隔(或者,程序可以跳過下一個style5)使用BeautifulSoup查找標籤並評估它是否符合一些條件

我以粗體顯示程序的一部分,也就是讓程序查找下一個p類,並用style4和style5來評估它,因爲我在查找和評估p類標記時遇到了問題,所以我選擇拉我的代碼圈外的,只是盡力去完成對於新手任務的第一次迭代這是我到目前爲止的代碼:

import urllib2 
from bs4 import BeautifulSoup 
soup = BeautifulSoup(urllib2.urlopen('http://www.kcda.org/KCDA_Awarded_Contracts.htm').read()) 
next_vendor = soup.find('p', {'class': 'style4'}) 
print next_vendor 
next_commodity = next_vendor.find_next('p', {'class': 'style5'}) 
print next_commodity 
next = next_commodity.find_next('p') 
print next 

我想感謝所有幫助任何人都可以提供預先感謝!

+0

所以你的輸出應該是供應商和類別的選項卡分隔文件? – shaktimaan

+0

是的。我只是沒有包含那部分代碼,因爲在我將任何東西寫入文件之前,我有太多的其他障礙要克服。 – CultureQuant

回答

3

我不完全確定你如何期待你的輸出。我假設你正試圖獲得在格式網頁中的數據:

Alphabet \t Vendor \t Category 

你可以這樣做:

# The basic things 
import urllib2 
from bs4 import BeautifulSoup 
soup = BeautifulSoup(urllib2.urlopen('http://www.kcda.org/KCDA_Awarded_Contracts.htm').read()) 

獲取感興趣的td

table = soup.find('table') 
data = table.find_all('tr')[-1] 
data = data.find_all('td')[1:] 

現在,我們將創建一個以字母作爲鍵和內部字典作爲值的嵌套輸出字典。內dict有廠商名作爲關鍵字和類別信息,因爲它的價值

output_dict = {} 
current_alphabet = "" 
current_vendor = "" 
for td in data: 
    for p in td.find_all('p'): 
     print p.text.strip() 
     if p.get('class')[0] == 'style6': 
      current_alphabet = p.text.strip() 
      vendors = {} 
      output_dict[current_alphabet] = vendors 
      continue 
     if p.get('class')[0] == 'style4': 
      print "Here" 
      current_vendor = p.text.strip() 
      category = [] 
      output_dict[current_alphabet][current_vendor] = category 
      continue 
     output_dict[current_alphabet][current_vendor].append(p.text.strip()) 

這得到在格式output_dict:

{ ... 

    u'W': { u'WTI - Weatherproofing Technologies': [u'Roofing'], 
      u'Wenger Corporation': [u'Musical Instruments and Equipment'], 
      u'Williams Scotsman, Inc': [u'Modular/Portable Buildings'], 
      u'Witt Company': [u'Interactive Technology'] 
     }, 
    u'X': { u'Xerox': [u"Copiers & MFD's", u'Printers'] 
     } 
} 

跳繩爲簡潔的早期部分。現在只需要訪問這個字典並寫出一個製表符分隔的文件。

希望這會有所幫助。

+0

好的方法! +1。 – Manhattan

+0

這太棒了!感謝您的徹底迴應! – CultureQuant

+0

如果它幫助你,請將答案標記爲已接受。這是在SO中表達感謝的方式。 – Manhattan

1

同意@shaktimaan。使用字典或列表是一個很好的方法。我的嘗試有點不同。

import requests as rq 
from bs4 import BeautifulSoup as bsoup 
import csv 

url = "http://www.kcda.org/KCDA_Awarded_Contracts.htm" 
r = rq.get(url) 
soup = bsoup(r.content) 

primary_line = soup.find_all("p", {"class":["style4","style5"]}) 
final_list = {} 
for line in primary_line: 
    txt = line.get_text().strip().encode("utf-8") 
    if txt != "\xc2\xa0": 
     if line["class"][0] == "style4": 
      key = txt 
      final_list[key] = [] 
     else: 
      final_list[key].append(txt) 

with open("products.csv", "wb") as ofile: 
    f = csv.writer(ofile) 
    for item in final_list: 
     f.writerow([item, ", ".join(final_list[item])]) 

對於刮,我們孤立style4style5標籤的時候了。我沒打擾style6或字母表標題。然後我們得到每個標籤內的文字。如果文本不是空格(這是遍佈表格,可能是混淆或糟糕的標記),然後我們檢查它是否是style4style5。如果是前者,我們將其分配爲空白列表的關鍵字。如果是後者,我們將它附加到最近鍵的空白列表中。顯然,每次我們只是碰到新的style4時,關鍵都會發生變化,所以這是一種相對安全的方法。

最後一部分很簡單:我們只在鍵值對的值部分使用​​將列表連接爲一個字符串。然後我們將其寫入CSV文件。

由於字典未排序,生成的CSV文件將不會按字母順序排序。下面結果的截圖:

enter image description here

它更改爲製表符分隔的文件是你。這很簡單。希望這可以幫助!

+0

感謝您的迴應!這也是一個很好的解決方案!我真的希望我可以選擇這個問題的多個答案,因爲這兩個答案都很優雅,而且效果很棒!再次感謝! – CultureQuant

相關問題