我写了一段代码,可以从名为195775.html的文件中提取表。我将输出保存在一个文本文件中。现在,我需要为同一目录中的所有20000个文件迭代此代码。此外,我还希望用它们各自的文件名来标记这些文件。即,每个文件都应该有一列(在表中),该列以文件名作为其值。此外,我希望输出文本文件按照输入文件命名(即名称应该匹配)。
这是我的代码:
import urllib2
import os
import time
import traceback
from bs4 import BeautifulSoup
outfile= open('C:/Users/Manvendra/Dropbox/Python/195775.txt','wb')
rfile = open('C:/Users/Manvendra/Dropbox/PRI/Data/AP/195775.html')
rsoup = BeautifulSoup(rfile)
nodes = rsoup.find('div',{'class':'frmhdtitle'})
if nodes!= None:
#print "div present"
x = nodes.findNext('table')
if x!= None:
#print "table present"
y = x.find('tbody')
if y!= None:
#print "tbody present"
z= y.findAll('tr')
if z!= None:
#print "tr present"
for wx in z[1:]:
num= wx.find('td').get_text()
print num
name= wx.find('td').findNext('td').get_text()
print name
age = wx.find('td').findNext('td').findNext('td').get_text()
print age
caste= wx.find('td').findNext('td').findNext('td').findNext('td').get_text()
print caste
gender= wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
print gender
quali = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
print quali
occu = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
print occu
#email = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
#print email
#ward = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
#print ward
resr = wx.find('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').findNext('td').get_text()
print resr
outfile.write(str(num) +"t" + str(name) +"t" + str(age) +"t" + str (caste) +"t" + str(quali) +"t" + str(occu) + "t" + str(resr) + str(infile) +"n")
outfile.close()
将代码放入一个单独的函数中,并为目录中的每个html文件调用它:
#!/usr/bin/env python2
import os
from glob import glob
dest_dir = 'C:/Users/Manvendra/Dropbox/Python'
for html_filename in glob('C:/Users/Manvendra/Dropbox/PRI/Data/AP/*.html'):
basename = os.path.splitext(os.path.basename(html_filename))[0]
with open(html_filename, 'rb') as html_file,
open(os.path.join(dest_dir, basename + '.txt'), 'wb') as csv_file:
html2csv(html_file, csv_file)
其中html2csv()
为:
import logging
from bs4 import BeautifulSoup
log = logging.getLogger(__name__)
def html2csv(html_file, csv_file):
writerow = csv.writer(csv_file, dialect=csv.excel_tab).writerow
div = BeautifulSoup(html_file).find('div', 'frmhdtitle')
try:
rows = div.find_next('table').tbody.find_all('tr')[1:]
except AttributeError:
log.warning("No info in %s file", html_file.name)
else:
for tr in rows:
writerow([td.get_text().encode('utf-8')
for td in tr.find_all('td')[:8]] + [html_file.name])
注意:代码中的findNext('td')
方法在不考虑元素边界的情况下搜索html文档,即,它可能会找到属于不同行甚至不同表的td
,只要它在文档中更远。我重写了这个循环,假设您希望在每行中找到八个相邻的<td>
元素。
这样做:
files = os.listdir(directoryPath)
for file in files:
*your code*
请注意,如果要打开文件,则需要打开路径:directoryPath+"/"+file。关于您想要命名文件的所有标记和文件名,"file"现在是一个变量,它包含您正在处理的文件的名称,所以您可以随心所欲地使用它。