请教大侠从网页的HTML语言中提取需要的信息该如何编程?
我在做一个股票信息的提取工作,已经能够从网页上将HTML语言下载到本地,但是不知道要提取价格这一部分实时数据接下去该怎么办?
<tr height="25" bgcolor="#FFFFFF">
<td align=middle class=itm nowrap>600028</td>
<td align=middle class=itm nowrap><a href=../q/bc.php?code=600028 class=link10>中国石化</a></td>
<td align=right class=itm nowrap>5.24 </td>
<td align=right class=itm nowrap>5.23 </td>
<td align=middle class=itm nowrap>5.20 - 5.41</td>
<td align=right class=itm nowrap><font color=#ff0000><b>5.35</b></font> </td>
<td align=right class=itm nowrap><font color=#ff0000>+0.11</font> </td>
<td align=right class=itm nowrap><font color=#ff0000>+2.10%</font> </td>
<td align=right class=itm nowrap>704,630 </td>
<td align=right class=itm nowrap>37,600 </td>
<td align=middle class=itm nowrap>
<a href="../q/dc.php?code=600028&b=0"><font color=blue>K</font></a>
<a href="../q/cwzy.php?code=600028&b=0"><font color=blue>F</font></a>
<a href="../q/hp.php?code=600028&b=0"><font color=blue>H</font></a>
<a href="../q/ta.php?code=600028&b=0"><font color=blue>T</font></a>
<a href="../news/index.php?code=600028&b=0"><font color=blue>N</font></a>
<a href="../m/mb.php?code=600028"><font color=blue>B</font></a></td></tr></td></tr>
问题点数:100、回复次数:18Top
1 楼sprite1211()回复于 2006-03-01 15:56:51 得分 0
救啊!Top
2 楼du51(郁郁思扬)回复于 2006-03-01 16:04:04 得分 0
你能不能把什么是价钱说一下?
比如+2.10%
这个是价钱吗?
再比如K这个东西不要读出来吧?
说的明白一点.Top
3 楼sprite1211()回复于 2006-03-01 16:09:22 得分 0
5.35是价格,+0.11是涨额,+2.10%是涨幅
最好还有code(代码)和股票名称
其他都不用了
谢!Top
4 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2006-03-01 16:20:45 得分 0
既然html文件已经下载了下来,就当作一个本地的文本文件
来查找特定的关键字吧
比如你的例子当中的“中国石化”这组字 或者前面的股票代码,
然后从该位置,开始按照html的格式来分析
html文件的格式主要是 <keyword > 内容 </keyword> 这种模式
找到<>分析去
这个没有什么取巧的办法,而且日后网页设计的格式变化了,代码还要重新写
另外一个可能采用的办法是ie编程,提取网页当中的各个对象元素的类型,然后查询去
网上的从一个网页当中提取所有的链接地址的例子很多,可以仿照着做Top
5 楼sprite1211()回复于 2006-03-01 16:27:30 得分 0
问题是股票信息是一直都在变化的,当作一个文本的话是不是提取出来的数据就是固定不变的了?Top
6 楼cyberHunK(→迈克·老猫←)回复于 2006-03-01 16:39:04 得分 0
没什么办法,只有进行文件操作了!但是如果格式统一,对文件操作也是很方便的,怕的就是变!Top
7 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2006-03-01 16:41:43 得分 0
两步,第一步把页面抓下来,第二步分析这个页面
如果你想在线的实现,就要写一个插件了:
http://www.vckbase.com/document/viewdoc/?id=1093Top
8 楼sprite1211()回复于 2006-03-01 17:00:31 得分 0
页面我已经抓下来了,接下去怎么分析呢?Top
9 楼oo(为了名副其实,努力学习oo技术ing)回复于 2006-03-01 17:09:11 得分 0
用脚本语言 支持正则表达式的, 写一个正则表达式,匹配一下就行了Top
10 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2006-03-01 17:10:11 得分 0
分析是要按照下载下来的页面的格式来做啊
html本身就是一个模块话的结构,用<keyword></keyword>框成一段一段的了
而且股票这个东西的网页也一定是模板化的动态页面的
只要把这个模板结构搞定,就出来了Top
11 楼ugg(逸学堂(exuetang.net))回复于 2006-03-01 17:20:31 得分 0
页面我已经抓下来了,接下去怎么分析呢?
`~`~`~`~`~`~`~`~`~`~`~`~
#include <sstream>
using namespace::std;
void main()
{
ifstream in("html.htm")
ostringstream str;
str << in.rdbuf();
string str = str.str();// 做个转换目的就是防止<>标准在不同得行中.
int iPos(0)
while((iPos = str.find('<',iPos)!=string::nops)
{
int iTemp(iPos+1);
if((iTemp = str.find('>',iPos)!=string::nops)
{
str.delete(iPos,iTemp-iPos-1)
}
}
}
经过上面处理str中剩余得字符传都是有用得信息..Top
12 楼du51(郁郁思扬)回复于 2006-03-01 17:33:39 得分 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
void show(FILE *fp)
{
char file[10000],ch,*p=file,*q,*endptr;
int i=0;
double price;
/*写入数组*/
while((ch=fgetc(fp))!=EOF)*p++=ch;
*p=0;p=file;
/*求 code*/
if(p=strstr(p,"code="))
{
p+=5;
while(*p==' ')p++;
q=p;
while(*q-' ')*q++;
*q=0;
printf("代码是:%s\n",p);
}
/*求名*/
while(*q++-'>');p=q;
while(*p-'<')p++;*p=0;
printf("名字是:%s\n",q);
/*求价钱*/
q=p+1;
if(q=strstr(q,"<b>"))
{
p=q+3;
while(*p==' ')p++;
q=p;
while(*p++-' ');*p=0;
price=strtod(q,&endptr);
printf("价钱是:%.2f\n",price);
}
/*求涨额*/
q=p=p+15;
if(p=strstr(p,"</font>"))
{
*p=0;
q=p-1;
while(*q---'>');q+=2;
printf("涨额是:%s\n",q);
}
/*求涨幅*/
while(*p++-'%');*p=0;
q=p-1;
while(*q---'>');q+=2;
printf("涨幅是:%s\n",q);
}
int main()
{
FILE *fp=fopen("test.html","r");
show(fp);
fclose(fp);
system("PAUSE");
return 0;
}
/*结果如下
代码是:600028
名字是:中国石化
价钱是:5.35
涨额是:+0.11
涨幅是:+2.10%
请按任意键继续. . .
*/Top
13 楼Holmescn(Holmes·Conan)回复于 2006-03-01 18:20:25 得分 0
用正则表达式啊,这么容易的问题。有很多库支持这个,你也可以用一些如perl的语言,支持正则的,这个很容易,正则表达式的用法,在网上有很多啊。Top
14 楼antter(JiangMiao)回复于 2006-03-01 18:23:11 得分 0
int main(int argc,char** argv)
{
string s;
fstream in;
in.open("test.txt");
load_file(s,in);
s=regex_replace(s,regex("<(.*?)>|\\r"),"");
s=regex_replace(s,regex(" ")," ");
vector<string> vec;
regex_split(::back_inserter< vector<string> >(vec),s,regex("\\n"));
cout<<"代码:"<<vec.at(0)<<endl;
cout<<"名字:"<<vec.at(1)<<endl;
cout<<"价钱:"<<vec.at(3)<<endl;
cout<<"涨额:"<<vec.at(6)<<endl;
cout<<"涨幅:"<<vec.at(7)<<endl;
return 0;
}
结果同du51(郁郁思扬)Top
15 楼sprite1211()回复于 2006-03-01 18:52:31 得分 0
谢谢各位高手Top
16 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-02 09:02:09 得分 0
http://blog.csdn.net/jiangsheng/archive/2003/08/15/3793.aspxTop
17 楼coder1(穿上防砖马甲和党员干部打成一片)回复于 2006-03-02 10:38:18 得分 0
用正则表达式啊
比如要想提取"中国石化"就可以这样写:
class=link10>(.*?)\s*</Top
18 楼wjd7623054(千古风流)回复于 2006-03-02 19:02:49 得分 0
正则可以,自己分析也不难啊Top




