[高分请教高效代码]提取表格中的数据到数据库
<tr bgcolor="#F7EBE7">
<td align="center" bgcolor="#FF9999" style="color: #FFFFFF; font-weight: bold">英足杯</td>
<td align="center">19日04:00</td>
<td align="center" style="color: red; font-weight: bold">完</td>
<td align="right">伯恩利</td>
<td align="center" style="font-family: verdana"><a href="javascript:showGoalList(135990, '_cn')"><font color="red"><b>1-0</b></font></a></td>
<td>利物浦 <img src=images/redcard1.gif></td>
<td align="center" style="color: red; font-family: verdana">0-0</td>
</tr>
xmlhttp得来的页面源码中含有很多这样结构的html,如何把需要的内容取出来存入数据库!其中一个<tr>对应数据库中的一个记录,一个<td>对应数据库中的字段。
问题点数:100、回复次数:13Top
1 楼xiwanghope(希望)回复于 2005-01-19 12:24:29 得分 0
用正则表达式分析过滤出你需要的数据,然后在编排你的格式
如果你不会正则表达式,可以去找个资料看看。。Top
2 楼hackate(兰花开香入梦境,独思佳人亦飘然!!)回复于 2005-01-19 12:40:52 得分 0
恩用正则表达式吧!Top
3 楼ruide205(蓝色河流)回复于 2005-01-19 13:02:50 得分 0
哪位大侠有时间给贴出代码,满分赠送!Top
4 楼moonvan(<修炼内功>)回复于 2005-01-19 14:03:11 得分 20
<%
'作者信息:
'昵称:小灰
'QQ:103895
'http://asp2004.net
'http://blog.csdn.net/iuhxq
hehe = Hello("http://mmsg.qq.com/cgi-bin/gddylist?Type=13&Sort=1&Page=3", "<html>", "</html>", ".*(<td width=""35%"" bgcolor=""#[\dABCDE]{6}"">(.*)</td>)[.\n]*", "<font style=""font-size:9pt;"" color=blue>$2</font><br>")
response.Write hehe
Function Hello(strUrl, strStart, strEnd, patrn, replStr)
Str = GetBody(strUrl)
Str = MyMid(Str, strStart, strEnd)
Str = ReplaceTest(patrn, replStr, Str)
Hello = Str
End Function
Function MyMid(Str, strstart, strend)
If strstart = "" Then
i = 0
Else
i = InStr(Str, strstart)
End If
If strend = "" Then
j = Len(Str)
Else
j = InStr(i, Str, strend)
End If
MyMid = Mid(Str, i, j - i + 1)
End Function
Function ReplaceTest(patrn, replStr, str1)
Dim regEx, match, matches
Set regEx = New RegExp
regEx.Pattern = patrn
regEx.IgnoreCase = True
regEx.Global = True
Set matches = regEx.Execute(str1)
For Each match in matches
ReplaceTest = ReplaceTest®Ex.Replace(Match.Value, replStr)
Next
End Function
Function GetBody(Url)
Set objXML = CreateObject("Microsoft.XMLHTTP")
With objXML
.Open "Get", Url, False, "", ""
.SEnd
GetBody = .ResponseBody
End With
GetBody = BytesToBstr(GetBody, "GB2312")
Set objXML = Nothing
End Function
Function BytesToBstr(strBody, CodeBase)
Set objStream = Server.CreateObject("Adodb.Stream")
With objStream
.Type = 1
.Mode = 3
.Open
.Write strBody
.Position = 0
.Type = 2
.Charset = CodeBase
BytesToBstr = .ReadText
.Close
End With
Set objStream = Nothing
End Function
%>
其他调用示例:
hehe = Hello("http://list.mp3.baidu.com/song/A.htm", "<table width=""90%"" border=""0"" align=""center"" cellpadding=""3"" cellspacing=""0"" bgcolor=""#f5f5f5"" >", "<DIV align=center>", ".*(<td width=""20%""><a href="".*\.htm"" target=_blank>)(.*)(</a></td>)[.\n]*", "<font style=""font-size:9pt;"" color=blue>$2</font><br>")
Top
5 楼ruide205(蓝色河流)回复于 2005-01-19 20:48:45 得分 0
非常感谢上面兄弟的答复,不过那个好象是简单的替换,能不能针对我上面贴出的代码,贴出正则,小弟初次用正则,找个标准学习学习,先谢谢了~:)Top
6 楼ruide205(蓝色河流)回复于 2005-01-19 21:36:12 得分 0
顶下,明天早上来结贴Top
7 楼xiwanghope(希望)回复于 2005-01-19 22:04:09 得分 50
Dim re
Set re = New RegExp
re.global = true
re.Pattern = "<tr\s*bgcolor="".{7}"">\s*"&_
"<td\s*align=""center""\s*bgcolor="".{7}""\s*style=""color:\s*.{7};\s*font-weight:\s*bold"">(.+?)</td>"&_
"<td\s*align=""center"">(.+?)</td>\s*"&_
"<td\s*align=""center"" style=""color: red; font-weight: bold"">(.+?)</td>\s*"&_
"<td\s*align=""right"">(.+?)</td>\s*"&_
"<td\s*align=""center""\s*style=""font-family:\s*verdana""><a\s*href=""javascript:showGoalList\(\d+,\s*'_cn'\)""><font color=""red""><b>(.+?)</b></font></a></td>\s*"&_
"<td>(.+?)(<img(.+?)>)*</td>\s*"&_
"<td\s*align=""center""\s*style=""color:\s*red;\s*font-family:\s*verdana"">(.+?)</td>\s*"&_
"</tr>\s*"
For Each oMatch in re.Execute(TemText)
response.write oMatch.SubMathces(0)
response.write oMatch.SubMathces(1)
response.write oMatch.SubMathces(2)
response.write oMatch.SubMathces(3)
response.write oMatch.SubMathces(4)
response.write oMatch.SubMathces(5)
response.write oMatch.SubMathces(8)
Next
'这些是你所有td包含的值,0代表第一个,6,7匹配的是最后一个td里的<img>标签不用管他
按照你的希望存到一个地方就可以了。
分都给我好了,呵呵Top
8 楼S.F.(chinasf.cnblogs.com)回复于 2005-01-19 22:05:43 得分 30
为什么不用js把值遍历出来提交??把下面的代码保存到html文件中运行一下看看?
-----------------------------------
<table id="testtable">
<tr bgcolor="#F7EBE7">
<td align="center" bgcolor="#FF9999" style="color: #FFFFFF; font-weight: bold">英足杯</td>
<td align="center">19日04:00</td>
<td align="center" style="color: red; font-weight: bold">完</td>
<td align="right">伯恩利</td>
<td align="center" style="font-family: verdana"><a href="javascript:showGoalList(135990, '_cn')"><font color="red"><b>1-0</b></font></a></td>
<td>利物浦 <img src=images/redcard1.gif></td>
<td align="center" style="color: red; font-family: verdana">0-0</td>
</tr>
<tr bgcolor="#F7EBE7">
<td align="center" bgcolor="#FF9999" style="color: #FFFFFF; font-weight: bold">英足杯</td>
<td align="center">19日04:00</td>
<td align="center" style="color: red; font-weight: bold">完</td>
<td align="right">伯恩利</td>
<td align="center" style="font-family: verdana"><a href="javascript:showGoalList(135990, '_cn')"><font color="red"><b>1-0</b></font></a></td>
<td>利物浦 <img src=images/redcard1.gif></td>
<td align="center" style="color: red; font-family: verdana">0-0</td>
</tr>
</table>
<script>
var ttb = document.getElementById("testtable");
var td = "";
for(var i=0;i<ttb.rows.length;i++){
for(var j=0;j<ttb.rows(i).cells.length;j++){
td+=ttb.rows(i).cells(j).innerHTML+",";
}
td+="\r\n";
}
alert(td);
</script>Top
9 楼S.F.(chinasf.cnblogs.com)回复于 2005-01-19 22:07:44 得分 0
如果你只想取纯文本,那么修改innerHTML 为innerText即可,也就是这样的;
<script>
var ttb = document.getElementById("testtable");
var td = "";
for(var i=0;i<ttb.rows.length;i++){
for(var j=0;j<ttb.rows(i).cells.length;j++){
td+=ttb.rows(i).cells(j).innerText+","; //每个格子的内容都加入逗号
}
td+="\r\n"; //一个新行
}
alert(td);
</script>
Top
10 楼S.F.(chinasf.cnblogs.com)回复于 2005-01-19 22:22:44 得分 0
按你的格式,帮你修整了一下;
保存以下内容为1.htm
<table id="testtable">
<tr bgcolor="#F7EBE7">
<td align="center" bgcolor="#FF9999" style="color: #FFFFFF; font-weight: bold">英足杯</td>
<td align="center">19日04:00</td>
<td align="center" style="color: red; font-weight: bold">完</td>
<td align="right">伯恩利</td>
<td align="center" style="font-family: verdana"><a href="javascript:showGoalList(135990, '_cn')"><font color="red"><b>1-0</b></font></a></td>
<td>利物浦 <img src=images/redcard1.gif></td>
<td align="center" style="color: red; font-family: verdana">0-0</td>
</tr>
<tr bgcolor="#F7EBE7">
<td align="center" bgcolor="#FF9999" style="color: #FFFFFF; font-weight: bold">英足杯</td>
<td align="center">19日04:00</td>
<td align="center" style="color: red; font-weight: bold">完</td>
<td align="right">伯恩利</td>
<td align="center" style="font-family: verdana"><a href="javascript:showGoalList(135990, '_cn')"><font color="red"><b>1-0</b></font></a></td>
<td>利物浦 <img src=images/redcard1.gif></td>
<td align="center" style="color: red; font-family: verdana">0-0</td>
</tr>
</table>
<script>
var ttb = document.getElementById("testtable");
var td = "";
var uriParam = ""; //url参数列表
for(var i=0;i<ttb.rows.length;i++){
for(var j=0;j<ttb.rows(i).cells.length;j++){
td+=ttb.rows(i).cells(j).innerText+",";
}
td=td.substr(0,td.length-1); //去掉最后一个逗号
uriParam += "td=" + td + "&"; //组合QueryString 参
td = "";
}
uriParam=uriParam.substr(0,uriParam.length-1); //去掉最后一个&连接符号
alert(uriParam); //显示参数
window.open('2.asp?'+uriParam,'_self'); //送给1.asp 保存
</script>
保存以下内容为2.asp
<script language=vbscript runat=server>
dim a,i
For Each objItem In Request.QueryString
Response.Write objItem & " = " & Request.QueryString(objItem) & "<BR>" '这里显示遍历出的参数内容
'分析参数内容,逗号分割
Response.write "<hr><h1>开始分析内容</h1><hr>"
a = Split(Request.QueryString(objItem),",",-1,1)
if isArray(a) then
for i=lbound(a) to ubound(a)
Response.write "读取值:" & a(i) & "<hr>" '输出值,这里获取的每个表格单元格内的值,你可以保存到库里去了
next
else
Response.Write (A) '这里是无法分割的内容
end if
Next
</script>Top
11 楼ruide205(蓝色河流)回复于 2005-01-20 09:44:24 得分 0
多谢各位兄弟出手,研究下先~:)Top
12 楼ruide205(蓝色河流)回复于 2005-01-20 11:45:07 得分 0
希望兄的代码已看过,除漏了一空格匹配和SubMathces的笔误,其它调试通过!Top
13 楼ruide205(蓝色河流)回复于 2005-01-20 12:34:59 得分 0
S.F.(写游戏的猪) 兄的代码已看过,1.htm中
uriParam += "td=" + td + "&"; //组合QueryString 参
改为
uriParam += "td"+i+"=" + td + "&"; //组合QueryString 参
调试通过,在td后加了变量i,以区分get变量名
非常感谢兄弟们的热心帮助!另开一贴散分,以上留名的兄弟都可以去领分!Top




