关于网页提取代码(30)

  • 主题发起人 主题发起人 terry_zhou82
  • 开始时间 开始时间
T

terry_zhou82

Unregistered / Unconfirmed
GUEST, unregistred user!
网页代码如下:<table id="weather_simple_table"><tr><td><strong>今天</strong></td><td>阴转多云</td><td><span class="high">16℃</span>~ <span class="low">7℃</span></td></tr>。。。。我的CODE如下,但是在结尾处总会显示出</TD>大家帮我看看错在哪里啊?procedure TForm1.FormCreate(Sender: TObject);var rStream: TStringstream; astr,astr1,astr2:string; ii:integer;begin rStream:= TStringstream.Create(''); IdHTTP1.Get('http://tool.115.com/tianqi/江阴',rStream); astr := rStream.DataString; astr2 := copy(astr, pos('</strong></td>', astr)+14, 100); astr2 := copy(astr2,Pos('<td>',astr2)+4,(Pos('</td>',astr2)-1)); // ShowMessage(IntToStr(Pos('</td>',astr2)-1)); label1.caption:=Trim(Utf8ToAnsi(astr2));我只需提取“阴转多云”的字样
 
最好是能找到一个html代码分析器控件.
 
你最后一次的copy错了 应该是</td>的位置减去<td>位置 才是要copy的数量var ... m,n:integer;begin ... m:=Pos('<td>', astr2)+4; n:=Pos('</td>', astr2); astr2 := copy(astr2, m, n-m); ...end;
 
另外 分析网页内容最好用mshtml里给的接口按table取内容,你这么分析太累了,页面代码随便变变就要重新写
 
astr2 := copy(astr2,Pos('<td>',astr2)+4,(Pos('</td>',astr2)-1));这一行错了!这样写:varnPos:Integer;begin....nPos:=Pos('<td>',astr2);astr2 := copy(astr2,nPos+4,(Pos('</td>',astr2)-nPos-4));....end;
 
hs-kill老大,为什么有时候截取的最后一个文字,像是少了一半,比如说“晴到多云”,云字只有一半?
 
额...那就是你截的位数算错了呗 你要是用D2009以前的版本 字符都是ANSI的 一个汉字是2个字符,比如晴到多云你要是截7个字符 云就是一半了呗所以建议你还是用MSHTML里的接口做吧,直接取显示内容
 
HS-KILL, 有没有MSHTML的例子啊?
 
下面是段简单的用MSHTML接口分析页面的东西procedure TFrmMain.webDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);var doc:IHTMLDOCUMENT2; m:integer; bt:IHTMLInputElement; ln:HTMLAnchorElement; cell1,cell2:HTMLTableCell; tr:IHTMLTableRow; item : OleVariant; b:byte;begin if ((not flogin) and (URL='about:blank')) then exit; if flogin then begin if (URL='about:blank') and (not FLoginning) then DoLogin else begin FLoginning:=false; flogin:=false; web.Navigate(URLS); end; exit; end; doc:=(web.Document as IHTMLDocument2); for m:=0 to doc.links.length-1 do begin item:=doc.all.item(m,0); if SUCCEEDED(doc.links.item(m,0).QueryInterface(IHTMLAnchorElement, ln)) then begin if (ln.outerText='登录') then begin web.Stop; flogin:=true; web.Navigate('about:blank'); exit; end; end; end; case byte(URLS.Objects) of 1: begin b:=0; for m:=doc.all.length-1 downto 0 do begin item:=doc.all.item(m,0); if SUCCEEDED(doc.all.item(m,0).QueryInterface(IHTMLTableRow, tr)) then if (tr.cells.length>1) then if SUCCEEDED(tr.cells.item(0,0).QueryInterface(IHTMLTableCell, cell1)) and SUCCEEDED(tr.cells.item(1,0).QueryInterface(IHTMLTableCell, cell2)) then if pos(widestring('在线时间'),cell1.outerText)=1 then begin onlinetime:=cell1.outerText+cell2.outerText; inc(b); end; if b>0 then break; end; end; end; GetStat;end;
 
这个是不是要添加WEBBROWER控件啊?
 
对 当然也可以用indy的吧网页源码提出来让后直接创建IHTMLDocument2接口解析不使用WebBrowser分析网页,提取所有链接var doc:IHTMLDocument2; bd:IHTMLElement; ln:IHTMLAnchorElement; i:integer; item,vHTML : OleVariant;begin doc:=CoHTMLDocument.Create as IHTMLDocument2; doc.designMode:='ON'; doc.charset:='UTF-8'; vHTML := VarArrayCreate([0, 0], varVariant); vHTML[0] := strs.Text; doc.Write(PSafeArray(TVarData(vHTML).VArray)); doc.Close; for i:=0 to doc.links.length-1 do begin item:=doc.links.item(i,0); if SUCCEEDED(doc.links.item(i,0).QueryInterface(IHTMLAnchorElement, ln)) then memo1.Lines.Add(item.href); end; doc:=nil;end;使用idhttp发送页面提交var Astrs:tstringlist;begin IdHTTP1.Request.Referer:='http://www.kaixin001.com/'; IdHTTP1.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; CNCDialer; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)'; IdHTTP1.Request.Host:='www.kaixin001.com'; IdHTTP1.Request.Connection:='Keep-Alive'; idhttp1.Request.ContentType:='application/x-www-form-urlencoded'; Astrs:=tstringlist.Create; Astrs.Add('url=/'); Astrs.Add('email=hs_kill_god@hotmail.com'); Astrs.Add('password=ikillyou'); strs.Text:=IdHTTP1.Post('http://www.kaixin001.com/login/login.php',Astrs); Astrs.Free; strs.Text:=Utf8ToAnsi(IdHTTP1.Get('http://www.kaixin001.com/friend')); memo2.Text:=strs.Text;end;
 
hs-kill,这个问题也困扰多时,我一直用间接办法提取,有用你说的以上方法“直接取显示内容”代码吗,我再开帖加200分。
 
比如:http://www.hanbintour.cn/aag.asp不要代码,只要显示的信息“6℃~11℃ 微风 七天预报 ”,当然,各地信息不同。成功立即开帖赠分;发邮箱也行: akyytq@163.com
 
hs-kill,我如果不想改代码的话,有没有什么办法来让他不截取半个文字啊。我使用D7的。是不是只要用D2010的话,就行了?
 
这个用D几没关系 ANSI的就是一个中文2个字符长度 截的时候注意就行了 别按一个中文一个字符算就不会出错,当然 D2009或者D2010默认UNICODE的就不用考虑这么多了 全都是双字符,直接按个数取就行了,只是省事而已To:ranxg你那个不行...我说的是不用webbrowser解析HTML代码,你那个实际上是http://m.weather.com.cn/m/pn8/weather.htm 这个页面内容你看下网页源码,里面是调用JS代码来实现的,如果不想用webbrowser那只能自己想办法传参数调用它的JS代码获取返回值,虽然不是没办法,不过相对来讲麻烦点(个人觉得麻烦),还不如直接用webbrowser来打开后去document的outputtext方便
 
JS不会。直接用webbrowser来打开后去document的outputtext,有例程吗,我在网上找了代码,编译通过,但提取不出来: Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterText);
 
procedure TForm1.Button1Click(Sender: TObject);begin WebBrowser1.Navigate('http://m.weather.com.cn/m/pn8/weather.htm');end;procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);begin memo1.Lines.Text:=IHTMLDOCUMENT2(WebBrowser1.Document).body.outertext;end;
 
谢谢,马上试,成功立即兑现
 
hs-kill兄,关键问题是现在我的编码在d2009/2010里面都通不过。我用下面代码截取后var rStream: TStringstream; astr,astr1,astr2:string; ii:integer;begin rStream:= TStringstream.Create(''); IdHTTP1.Get('http://tool.115.com/tianqi/江阴',rStream); astr := rStream.DataString; astr2 := copy(astr, pos('</strong></td>', astr)+14, 100);出现的确认HTML的文件头。类似<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>。。。。我看了文件的编码是UTF-8的,我用astr := rStream.DataString;astr2 := utf8toansi(copy(astr, pos('</strong></td>', astr)+14, 100));之后,截取的也不完整。不知道是什么原因
 
晕 网页网址用的是UTF8编码啊 你的江阴以中文形式get当然不行了 IdHTTP1.Get('http://tool.115.com/tianqi/%E6%B1%9F%E9%98%B4', rStream);这样
 
后退
顶部