2016-12-14 76 views
-2

我用bs4編寫了一個Python 3程序,以便成功獲取維基百科的子類別。現在,我可以看到打印結果,但我無法將結果寫入文件。如何寫一個文件作爲我的打印?

from bs4 import BeautifulSoup 
import requests 
import csv 

url = 'https://en.wikipedia.org/wiki/Category:proprietary software' 
content = requests.get(url).content 
soup = BeautifulSoup(content,'lxml') 
noOFsubcategories = soup.find('p') 
print('------------------------------------------------------------------') 
print(noOFsubcategories.text+'------------------------------------------------------------------') 
tag = soup.find('div', {'class' : 'mw-category'}) 
links = tag.findAll('a') 
#print(links) 

counter = 1 
for link in links: 
    print (str(counter) + " " + link.text) 
    counter = counter + 1 

with open('subcategories.csv', 'a') as f: 
    f.write(links) 
+0

你能更準確地解答這個問題嗎?怎麼了?你期望什麼? – jonrsharpe

+0

當我在python3中執行上面的代碼時,輸​​出文件是空的。所以,我發佈了上述問題。 –

+0

我通過以下答案解決了問題,並以學習者身份得到通知。對不起我的英語不好。除了我的語言,我絕對不會打字。 –

回答

2

只是一個小變化,循環下把寫,每個循環都會寫一個鏈接到文件

counter = 1 
for link in links: 
    print (str(counter) + " " + link.text) 
    counter = counter + 1 
    with open('subcategories.csv', 'a') as f: 
     f.write(link['href'].split(':')[1]+'\n') 

出來:

/wiki/Category:Formerly_proprietary_software 
/wiki/Category:Freeware 
/wiki/Category:Oracle_software 
/wiki/Category:Proprietary_cross-platform_software 
/wiki/Category:Proprietary_database_management_systems 
/wiki/Category:Proprietary_operating_systems 
/wiki/Category:Proprietary_version_control_systems 
/wiki/Category:Proprietary_wiki_software 
/wiki/Category:Shareware 
/wiki/Category:VMware 
/wiki/Category:Warez 

更好:

# do not need to open file in each loop, just put it above loop 
counter = 1 
with open('subcategories.csv', 'a') as f: 
    for link in links: 
     print (str(counter) + " " + link.text) 
     counter = counter + 1 
     f.write(link['href']+'\n') 
+0

如何獲得以上,沒有「/ wiki/Category:」? –

+0

我更新我的代碼 –

+0

哇!多麼簡單!我用這個方法去除數據。 filedata = filedata.replace('/ wiki/wiki/Category:','')非常感謝兄弟! –

0

首先初始化列表與索引和鏈接文本列表,然後使用csv.writer寫入csv文件。注意下面的使用enumerate()

links = [[index, a.get_text()] for index, a in enumerate(tag.find_all('a'), start=1)] 

with open('subcategories.csv', 'a') as f: 
    writer = csv.writer(f) 
    writer.writerows(links) 

而且,您可以通過使用單個CSS selector提高你定位的子類別的方式:

soup.select("div.mw-category a") 

完整的代碼我m執行:

import csv 

from bs4 import BeautifulSoup 
import requests 


url = 'https://en.wikipedia.org/wiki/Category:proprietary software' 
content = requests.get(url).content 
soup = BeautifulSoup(content, 'lxml') 
noOFsubcategories = soup.find('p') 

tag = soup.find('div', {'class': 'mw-category'}) 

links = [[index, a.get_text()] for index, a in enumerate(tag.find_all('a'), start=1)] 

with open('subcategories.csv', 'a') as f: 
    writer = csv.writer(f) 
    writer.writerows(links) 

運行此代碼後的subcategories.csv內容是:

1,Formerly free software 
2,Formerly proprietary software 
3,Freeware 
4,Oracle software 
5,Proprietary cross-platform software 
6,Proprietary database management systems 
7,Proprietary operating systems 
8,Proprietary version control systems 
9,Proprietary wiki software 
10,Shareware 
11,VMware 
12,Warez 
+0

但輸出文件的第一行如下。 「F,o,r,m,e,r,l,y,,f,r,e,e,s,o,f,t,w,a,r,e」我怎樣才能避開逗號? –

+0

@ info-farmer你確定你已經使用'writerows()'? – alecxe

+0

@ info-farmer我更新了正在執行的完整代碼。希望有所幫助。 – alecxe

相關問題