row counter简介(python实现将html表格转换成CSV文件)

本文目录
python实现将html表格转换成CSV文件
本文实例讲述了python实现将html表格转换成CSV文件的方法。分享给大家供大家参考。
具体如下:
使用方法:python html2csv.py *.html
这段代码使用了 HTMLParser 模块
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
# Hello, this program is written in Python -
programname = html2csv - version 2002-09-20 -
import sys, getopt, os.path, glob, HTMLParser, re
try: import psyco ; psyco.jit() # If present, use psyco to accelerate the program
except: pass
def usage(progname):
Display program usage.
progname = os.path.split(progname)
if os.path.splitext(progname): progname = python +progname
return %s
A coarse HTML tables to CSV (Comma-Separated Values) converter.
Syntax : %s source.html
Arguments : source.html is the HTML file you want to convert to CSV.
By default, the file will be converted to csv with the same
name and the csv extension (source.html - source.csv)
You can use * and ?.
Examples : %s mypage.html
This program is public domain.
Author : Sebastien SAUVAGE sebsauvage at sebsauvage dot net
% (programname, progname, progname, progname)
class html2csv(HTMLParser.HTMLParser):
A basic parser which converts HTML tables into CSV.
Feed HTML with feed(). Get CSV with getCSV(). (See example below.)
All tables in HTML will be converted to CSV (in the order they occur
in the HTML file).
You can process very large HTML files by feeding this class with chunks
of html while getting chunks of CSV by calling getCSV().
Should handle badly formated html (missing tr, /tr, /td,
extraneous /td, /tr...).
This parser uses HTMLParser from the HTMLParser module,
not HTMLParser from the htmllib module.
Example: parser = html2csv()
parser.feed( open(mypage.html,rb).read() )
open(mytables.csv,w+b).write( parser.getCSV() )
This class is public domain.
Author: Sébastien SAUVAGE sebsauvage at sebsauvage dot net
Versions:
2002-09-19 : - First version
2002-09-20 : - now uses HTMLParser.HTMLParser instead of htmllib.HTMLParser.
- now parses command-line.
To do:
- handle PRE tags
- convert html entities (name; and #ref;) to Ascii.
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.CSV =
# The CSV data
self.CSVrow =
# The current CSV row beeing constructed from HTML
self.inTD = 0 # Used to track if we are inside or outside a TD.../TD tag.
self.inTR = 0 # Used to track if we are inside or outside a TR.../TR tag.
self.re_multiplespaces = re.compile(s+) # regular expression used to remove spaces in excess
self.rowCount = 0 # CSV output line counter.
def handle_starttag(self, tag, attrs):
if tag == tr: self.start_tr()
elif tag == td: self.start_td()
def handle_endtag(self, tag):
if tag == tr: self.end_tr()
elif tag == td: self.end_td()
def start_tr(self):
if self.inTR: self.end_tr() # TR implies /TR
self.inTR = 1
def end_tr(self):
if self.inTD: self.end_td() # /TR implies /TD
self.inTR = 0
if len(self.CSVrow)
0:
self.CSV += self.CSVrow
self.CSVrow =
self.CSV += n
self.rowCount += 1
def start_td(self):
if not self.inTR: self.start_tr() # TD implies TR
self.CSVrow +=
self.inTD = 1
def end_td(self):
if self.inTD:
self.CSVrow += ,
self.inTD = 0
def handle_data(self, data):
if self.inTD:
self.CSVrow += self.re_multiplespaces.sub( ,data.replace(t, ).replace(n,).replace(r,).replace(,))
def getCSV(self,purge=False):
Get output CSV.
If purge is true, getCSV() will return all remaining data,
even if td or tr are not properly closed.
(You would typically call getCSV with purge=True when you do not have
any more HTML to feed and you suspect dirty HTML (unclosed tags).
if purge and self.inTR: self.end_tr() # This will also end_td and append last CSV row to output CSV.
dataout = self.CSV
self.CSV =
return dataout
if __name__ == __main__:
try: # Put getopt in place for future usage.
opts, args = getopt.getopt(sys.argv,None)
except getopt.GetoptError:
print usage(sys.argv) # print help information and exit:
sys.exit(2)
if len(args) == 0:
print usage(sys.argv) # print help information and exit:
sys.exit(2)
print programname
html_files = glob.glob(args)
for htmlfilename in html_files:
outputfilename = os.path.splitext(htmlfilename)+.csv
parser = html2csv()
print Reading %s, writing %s... % (htmlfilename, outputfilename)
try:
htmlfile = open(htmlfilename, rb)
csvfile = open( outputfilename, w+b)
data = htmlfile.read(8192)
while data:
parser.feed( data )
csvfile.write( parser.getCSV() )
sys.stdout.write(%d CSV rows written.r % parser.rowCount)
data = htmlfile.read(8192)
csvfile.write( parser.getCSV(True) )
csvfile.close()
htmlfile.close()
except:
print Error converting %s
% htmlfilename
try: htmlfile.close()
except: pass
try: csvfile.close()
except: pass
print All done.
希望本文所述对大家的Python程序设计有所帮助。
如何使用Aspose.Words在邮件合并时生成多个文档
产生多个文档需要进行多次邮件合并。如果需要将数据源中的所有数据都存在于一个单独的文件中,需要做到以下几点: 循环数据表中的所有行。 在邮件合并前载入(或复制)原始文档。 执行邮件合并,保存文件。 你可以在每个邮件合并前从一个文件或流中加载模板文件,但通常情况下,更为快速的方法是只加载一次文档,然后在每次邮件合并前从内存中复制。 要注意的是,执行邮件合并你应该有一个适当的模板文件。这个模板可以是一个Microsoft Word模板或一个普通的Microsoft Word文档,但它需要在插入数据的地方包含MERGEFIELD字段。每个字段的名称应和数据源中相应的字段相同。 C# using System; using System.Data; using System.Data.OleDb; using System.IO; using System.Reflection; using Aspose.Words; namespace MultipleDocsInMailMerge { class Program { public static void Main(string args) { //Sample infrastructure. string exeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar; string dataDir = new Uri(new Uri(exeDir), @"../../Data/").LocalPath; ProduceMultipleDocuments(dataDir, "TestFile.doc"); } public static void ProduceMultipleDocuments(string dataDir, string srcDoc) { // Open the database connection. string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dataDir + "Customers.mdb"; OleDbConnection conn = new OleDbConnection(connString); conn.Open(); try { // Get data from a database. OleDbCommand cmd = new OleDbCommand("SELECT * FROM Customers", conn); OleDbDataAdapter da = new OleDbDataAdapter(cmd); DataTable data = new DataTable(); da.Fill(data); // Open the template document. Document doc = new Document(dataDir + srcDoc); int counter = 1; // Loop though all records in the data source. foreach (DataRow row in data.Rows) { // Clone the template instead of loading it from disk (for speed). Document dstDoc = (Document)doc.Clone(true); // Execute mail merge. dstDoc.MailMerge.Execute(row); // Save the document. dstDoc.Save(string.Format(dataDir + "TestFile Out {0}.doc", counter++)); } } finally { // Close the database. conn.Close(); } } } } VB Imports Microsoft.VisualBasic Imports System Imports System.Data Imports System.Data.OleDb Imports System.IO Imports System.Reflection Imports Aspose.Words Namespace MultipleDocsInMailMerge Friend Class Program Public Shared Sub Main(ByVal args() As String) ’Sample infrastructure. Dim exeDir As String = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar Dim dataDir As String = New Uri(New Uri(exeDir), "../../Data/").LocalPath ProduceMultipleDocuments(dataDir, "TestFile.doc") End Sub Public Shared Sub ProduceMultipleDocuments(ByVal dataDir As String, ByVal srcDoc As String) ’ Open the database connection. Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dataDir & "Customers.mdb" Dim conn As New OleDbConnection(connString) conn.Open() Try ’ Get data from a database. Dim cmd As New OleDbCommand("SELECT * FROM Customers", conn) Dim da As New OleDbDataAdapter(cmd) Dim data As New DataTable() da.Fill(data) ’ Open the template document. Dim doc As New Document(dataDir & srcDoc) Dim counter As Integer = 1 ’ Loop though all records in the data source. For Each row As DataRow In data.Rows ’ Clone the template instead of loading it from disk (for speed). Dim dstDoc As Document = CType(doc.Clone(True), Document) ’ Execute mail merge. dstDoc.MailMerge.Execute(row) ’ Save the document. dstDoc.Save(String.Format(dataDir & "TestFile Out {0}.doc", counter)) counter += 1 Next row Finally ’ Close the database. conn.Close() End Try End Sub End Class End Namespace
常见否定前缀简介
阅读的时候我们经常会碰到一些不认识的词。在没有词典的情况下我们要通过各种手段猜测出单词的大概的模糊意思。因此一些常见的否定前缀就有必要知道了,因为否定前缀就意味着这个词是反方向或者是负向的意思。以下是一些常见的否定前缀的小结。 英语否定的前缀主要有a- ab- anti- counter- de- dis- il- im- in- ir- mal- mis- non- un- 等。
1. a-ab-主要加在形容词动词前,例如atypical非典型性的,abnormal非正常的;abuse滥用、错误使用、虐待;
2. anti-加在名词、形容词前边。最常见的是anti-Japanese抗日战争、anti-social厌恶社会的 反社会的、antidite解毒的药;
3. counter-加在名词、动词前,例如:counterstrike反击、counteract抵抗阻碍、counterrevolution反革命。
4. de-加在名词、形容词前,常见的例词有decrease减少,deteriorate恶化,demobilize遣散 使…复员、decolor 脱色 漂白;
5. dis-主要加在名词、形容词,动词之前,dis-为否定前缀的词有:disadvantage缺点、dishonorable不光彩的、disagree不同意、disappear消失、disarm解除武装、disconnect失去联系
6. il-主要加在以1开头的单词的前边,比如:illegal非法的、illiterate文盲的、illogical不合逻辑的;
7. im-加在字母m,b,p之前,这样的词有impossible不可能的、impolite不礼貌的
8. in-常加在形容词,名词之前,如incorrect不正确的、inability无能 无力、inaccurate不准确的等;
9. ir-放在以r开头的英语单词前面,比如:irregular不稳定的、irresistable不可抵抗的、irresolvable不能分解的 不能解决的;
10. mal-主要加在形容词名词之前,例如malfunction功能紊乱,malicious恶意的;
11. mis-加在动词、名词前,例词misunderstand误解、misjudge误判、misleading误导、misfortune不幸;
12. non-加在形容词、名词前,这样以non-为否定前缀的词有non-existence不存在、non-essential不主要的、non-electrical非电的;
13. un-主要放于名词,形容词,副词前面,常见的例子有unfinished未完成的、undoubted无疑的、unemployment失业。
如何使用 servlet jsp写分页
今天给同学用JSP+JavaBean+Servlet做了个分页。用的是MySQL+Tomcat+MyEclispe环境。
分页计数器如下:
package org.pagedemo.page;
/**
* Create on 2008-08-28 11:05
*
* @author qpy_2006
* 要用到分页,则在创建该类对象时
* 只需在传入rows的前提下调用counter(page,rows)方法就可以设置firstRow,totalRows,totalPages
* 在查询的dao中,把该类对象做为参数传入,
* 再通过调用对象的getFirstRow(),及getMaxSize()设置
*/
public class PageUtil {
private int totalRows; // 总行数即总记录数
private int totalPages; // 总页数
private int currentPage = 1; // 当前页
private int maxSize = 3; // 每页存放3条记录
private int firstRow = 0; // 数据库中第一行数据
/** Creates a new instance of PageCounter */
public PageUtil() {
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getMaxSize() {
return maxSize;
}
public void setMaxSize(int maxSize) {
this.maxSize = maxSize;
}
public int getFirstRow() {
return firstRow;
}
public void setFirstRow(int firstRow) {
this.firstRow = firstRow;
}
// 根据请求参数pageType翻页,即设置firstRow
// 根据请求参数rows总记录数计算总页数
public void counter(String pageType,int rows) {
this.totalRows = rows;
this.totalPages = (this.totalRows + this.maxSize - 1) / this.maxSize;
System.out.println("counter 中的totalPages的值为 "+this.totalPages+" 页");
pageType = pageType.toLowerCase();
if ("first".equals(pageType)) {
first();
} else if ("last".equals(pageType)) {
last();
} else if ("next".equals(pageType)) {
next();
} else if ("previous".equals(pageType)) {
previous();
}
}
// 首页
private void first() {
currentPage = 1;
firstRow = 0;
}
// 上页
private void previous() {
if (totalPages == 0) {
currentPage = 1;
} else {
if (currentPage == 1) {
currentPage = totalPages;
} else {
currentPage--;
}
}
firstRow = (currentPage - 1) * maxSize;
}
// 下页
private void next() {
if (totalPages == 0) {
currentPage = 1;
} else {
if (currentPage 《 totalPages) {
currentPage++;
} else if (currentPage == totalPages) {
currentPage = 1;
}
}
firstRow = (currentPage - 1) * maxSize;
}
// 尾页
private void last() {
currentPage = totalPages;
if (totalPages == 0) {
currentPage = 1;
}
firstRow = (currentPage - 1) * maxSize;
}
}
查询出所有的记录数:
package org.pagedemo.page;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.pagedemo.db.DBConnection;
public class PageDAO extends DBConnection {
// 查出所有的记录数
public int getRows() {
Connection conn = this.getConnection();
String sql = "select count(*) from t_page";
int rows = 0;
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
rows = rs.getInt(1);
}
System.out.println("rows " + rows);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return rows;
}
}
Servlet中控制分页
package org.pagedemo.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***
import org.pagedemo.page.PageDAO;
import org.pagedemo.page.PageUtil;
import org.pagedemo.po.User;
import org.pagedemo.user.dao.UserDAO;
/**
* @author qpy_2006 Servlet,本系统的核心控制器
*/
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
// 获得HttpSession并取得session,用户保存数据
// 以便在jsp页面或者其他servlet中获得该session中得值
HttpSession session = request.getSession();
// 获取分页的请求类别
String pageType = request.getParameter("pageType");
String action = request.getParameter("action");
List《User》 users = new ArrayList《User》();
PageDAO pd = new PageDAO();
PageUtil pu = new PageUtil();
UserDAO ud = new UserDAO();
// 获取数据库中记录数
int rows = pd.getRows();
if ("initial".equals(action)) {
// 第一次进入index.jsp页面时,查询出第一页
// 设置分页的各个属性,参见PageUtil这个类
pu.counter("first", rows);
session.setAttribute("pageBean", pu);
} else if ("page".equals(action)) {
// 点击分页请求时执行下一代码
pu = (PageUtil) session.getAttribute("pageBean");
pu.counter(pageType, pu.getTotalRows());
}
users = ud.findAll(pu);
// 把查询的结果users放到session中,
// 以便在jsp页面从session读取该users对象
session.setAttribute("users", users);
// 把PageUtil放到session中
session.setAttribute("pageBean", pu);
// 在servlet跳转到某个jsp页面
request.getRequestDispatcher("index.jsp").forward(request, response);
}
public void init() throws ServletException {
}
}
***隐藏网址***

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30
vba编写excel插件(excel vba中能否动态创建控件)
2026年9月7日 04:40





