pos从网页里抓取到的数据的问题(20)

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

tungh

Unregistered / Unconfirmed
GUEST, unregistred user!
search := Pos('" rel="no">', form1.Ripping.text); enditem := Pos('</a></h2>', form1.Ripping.text); itemname:= Copy(form1.Ripping.text, search+10, enditem-search-10);90%的搜索" rel="no">是可以正确获得数据的。但是有10%会出现2个或者3个" rel="no">这样的话就会照成读取错误。如何判断有多少个" rel="no">呢 并且选择搜索到的第几个?
 
读取完第一次,在循环读取,知道没有" rel="no">这个串就行了。strtemp = form1.Ripping.text;strsubtemp = " rel="no">;search := pos(strsubtemp, strtemp);while search >=0 dobegin strtemp := Copy(strtemp, search + Length( strsubtemp), Length(strtemp)); search := pos(strsubtemp, strtemp); end;OK.
 
StrUtils.PosEx
 
灾害兄弟不错!呵呵!
 
to 草原骏马,通常都是获取第一个 搜索多次没用to 地质灾害,StrUtils.PosEx怎么用?
 
先用stringreplace替代它 然后再处理或者说i:=pos(''" rel="no">'',s),delete(s,9) 然后再j;=pos ('" rel="no">''',s) 如果j>1则有你的数据
 
继续关注。还没解决[:)]
 
其实最关键的就是寻找最接近 '</a></h2>' 的 '" rel="no">' 的位置。Uses StrUtils;procedure TForm1.Button1Click(Sender: TObject);const cBegin = '" rel="no">'; cBeginLen = Length(cBegin); cEnd = '</a></h2>';var search,enditem,iTemp: Integer; sText,itemname: String;begin sText := form1.Ripping.text; enditem := Pos(cEnd, sText); search := Pos(cBegin, sText); while (search > 0) and (enditem > search) do begin iTemp := PosEx(cBegin,sText,search + cBeginLen); if (iTemp < 0) or (iTemp > enditem) then Break else search := iTemp; end; itemname := Copy(sText,search + cBeginLen, enditem - search - cBeginLen); ShowMessage(itemname);end;
 
<table width="300"><tr><td><table width="100%"><tr><td><h2 class="q1"><a href="http://wowdb.178.com/cn/item/728.html" rel="no">食谱:杂味炖肉</a></h2> 不绑定<br /><table width="100%"><tr><td>配方</td><th> 烹饪</th></tr></table><!--e-->需要: 烹饪(75)<br /></td></tr></table><span class="q2">使用:教你学会烹制杂味炖肉。</span><br />需要: <a class="q" href="/cn/item/729.html" >秃鹫肉条</a>(1), <a class="q" href="/cn/item/730.html" >鱼人的眼球</a>(1), <a class="q" href="/cn/item/731.html" >血牙野猪的头</a>(1)
<span class="q7">物品等級: 15</span><br /><br /><table width="100%"><tr><td><h2 class="q1"><a href="http://wowdb.178.com/cn/item/733.html" rel="no">杂味炖肉</a></h2> 不绑定<br /><table width="100%"><tr><td>消耗品</td><th> 食物和饮料</th></tr></table><!--e-->需要 等級 5<br /></td></tr></table><span class="q2">使用:<a href="/cn/spell/435.html">在24秒内恢复总计552点生命值,进食时必须保持坐姿。</a></span><br /><span class="q7">物品等級: 15</span></td><th style="background-position: top right;"></th></tr><tr><th style="background-position: bottom left; height:5px;"></th><th style="background-position: bottom right; height:5px;"></th></tr></table>例如上面这个。。。我要抓取的是第一个" rel="no">到第一个</a></h2>之间的字符串。其他的都是不需要的。要怎么做?
 
魔兽玩太多了。呵呵-----------------------------------------Str1 := 'rel="no">';Str2 := '</a><h2>';S := Copy(Html, Pos(Str1, Html) +1 , MaxInt);S := Copy(Html, 1, POs(Str2, Html) -1);---------------------------------------这几行应该够了, 不过需要判断Pos 是不是能找得到才行
 
我上面贴出来的代码已经可以了,我测试过可以截取到:食谱:杂味炖肉form1.Ripping 为 TEdit。
 
unit Unit2;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StrUtils, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;type TForm2 = class(TForm) Button1: TButton; Ripping: TEdit; IdHTTP1: TIdHTTP; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form2: TForm2;implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);const cBegin = '" rel="no">'; cBeginLen = Length(cBegin); cEnd = '</a></h2>';var i,from,search,enditem,iTemp: Integer; fromstr,st1,st2,Link,sText,itemname: String;beginst1:='728';//固定一个728编号测试from:=StrToInt(st1);st2:='728';for i := strtoint(st1) to strtoint(st2) do beginfrom:=from+1; fromstr:=inttostr(from);Link:='http://wowdb.178.com/cn/item/'+inttostr(from)+'.html'; form2.Ripping.Text:=form2.idHTTP1.Get(link); sText := form2.Ripping.text; enditem := Pos(cEnd, sText); search := Pos(cBegin, sText); while (search > 0) and (enditem > search) do begin iTemp := PosEx(cBegin,sText,search + cBeginLen); if (iTemp < 0) or (iTemp > enditem) then Break else search := iTemp; end; itemname := Copy(sText,search + cBeginLen, enditem - search - cBeginLen); ShowMessage(itemname);end; end;end.to liyinwei 似乎不行哦 你看看 是不是我哪里错了?ShowMessage出来的是整个页面的源文件数据。
 
其实就是几个 Pos 、PosEx、Copy 组合起来,楼主自己研究一下就可以了。procedure TForm1.Button1Click(Sender: TObject);const cBegin = '" rel="no">'; cBeginLen = Length(cBegin); cEnd = '</a></h2>'; cLink = 'http://wowdb.178.com/cn/item/'; cExp = '.html';var i,from,search,enditem,iTemp: Integer; fromstr,st1,st2,Link,sText,itemname: String;begin st1 := '728';//固定一个728编号测试 from := StrToInt(st1); st2 := '728'; for i := StrToInt(st1) to StrToInt(st2) do begin Inc(from); fromstr := IntToStr(from); Link := cLink + IntToStr(from) + cExp; // Ripping.Text := idHTTP1.Get(link); try sText := idHTTP1.Get(Link); enditem := Pos(cEnd, sText); search := Pos(cBegin, sText); while (search > 0) and (enditem > search) do begin iTemp := PosEx(cBegin,sText,search + cBeginLen); if (iTemp <= 0) or (iTemp > enditem) then Break else search := iTemp; end; itemname := Copy(sText,search + cBeginLen, enditem - search - cBeginLen); ShowMessage(Utf8ToAnsi(itemname)); except ShowMessage('下载失败:' + Link); end; end;end;
 
结贴。。会用POS 但是没用过POSEX 所以很多雾头 感谢大家的帮助。
 
后退
顶部