问题描述
这是我做的用C#提取web信息的一段程序,但是网页的源文件是表格里嵌表格,所以比较难提取源码数据,请高手帮忙看一下,可以加我好友,我把我要提取信息的网站给你,谢谢!!!privatevoidbutton1_Click(objectsender,EventArgse){//要抓取的URL地址stringUrl=textBox1.Text;//得到指定Url的源码stringstrWebContent=GetWebContent(Url);//rtxtHtmlSrc.Text=strWebContent//取出和数据有关的那段源码intiBodyStart=strWebContent.IndexOf("colspan=13",0);intiStart=strWebContent.IndexOf("</table>",iBodyStart);intiTableStart=strWebContent.IndexOf("<tr",iStart);intiTableStartb=strWebContent.IndexOf("3E89C0",iTableStart);intiTableEnd=strWebContent.IndexOf("</table>",iTableStartb);stringstrWeb=strWebContent.Substring(iTableStart,iTableEnd-iTableStartb);//生成HtmlDocumentWebBrowserwebb=newWebBrowser();webb.Navigate("about:blank");HtmlDocumenthtmldoc=webb.Document.OpenNew(true);htmldoc.Write(strWeb);HtmlElementCollectionhtmlTR=htmldoc.GetElementsByTagName("TR");foreach(HtmlElementtrinhtmlTR){stringstrID=tr.GetElementsByTagName("TD")[0].InnerText;stringstrName=tr.GetElementsByTagName("TD")[1].InnerText;//插入DataTableAddLine(strID,strName,"0");////插入数据库//InsertData(dt);dataGridView1.DataSource=dt.DefaultView;}
解决方案
解决方案二:
up
解决方案三:
分析字符串没什么难度就是麻烦点~~~可以考虑正则或者把它弄成XML
解决方案四:
帮顶
解决方案五:
<tdheight="30"colspan="6"><fontcolor="#FFFFFF">1/K1 平海路→小河路登云路口</font></td></tr><tralign="center"valign="top"bgcolor="FFECC3"><tdwidth="5%"height="30">序号</td><tdwidth="17%"height="30">站点名称<br>BusStopsName</td><tdwidth="46%"height="30">经过线路<br>BuslinesPassingBy</td><tdwidth="12%"height="30">副站名<br>SubnameOfTheBusstop</td><tdwidth="20%"height="30">辅助标注站名<br>SupplementaryNameofBusStops</td></tr><tralign="center"bgcolor="ECF4F9"><tdheight="30">1</td><tdheight="30"><tablewidth="100%"border="0"cellspacing="0"cellpadding="0"><tr><tdwidth="44%"align="center">平海路</td></tr></table></td><tdheight="30"><tableborder=0width="100%"><tr><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=3&line_name=K4"target="_blank">K4</a></td><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=895&line_name=27"target="_blank">27/K27</a></td><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=1307&line_name=K16"target="_blank">K16</a></td><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=1321&line_name=K286"target="_blank">K286</a></td></tr><tr><tdcolspan="25%"align="right"><ahref="line_more.jsp?stop_name=平海路"target="_blank">更多线路</a></td></tr></table></td><tdheight="30">市总工会</td><tdheight="30"></td></tr><tralign="center"bgcolor="ECF4F9"><tdheight="30">2</td><tdheight="30"><tablewidth="100%"border="0"cellspacing="0"cellpadding="0"><tr><tdwidth="44%"align="center">十四中</td></tr></table></td><tdheight="30"><tableborder=0width="100%"><tr><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=1246&line_name=K73"target="_blank">K73</a></td><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=1257&line_name=49"target="_blank">49/K49</a></td><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=1793&line_name=45"target="_blank">45/K45</a></td><tdwidth="25%"align="center"><ahref="line_search.jsp?line_id=1913&line_name=1"target="_blank">1/K1</a></td></tr><tr><tdcolspan="25%"align="right"><ahref="line_more.jsp?stop_name=十四中"target="_blank">更多线路</a></td></tr></table>
解决方案六:
这些是其中的一小段,下面还很多,我想提取的是stop_name=??后面??的内容,比如平海路,十四中,希望高手可以指点,谢谢..
解决方案七:
用正则吧,比较方便
解决方案八:
用正则来匹配就很容易提取了
解决方案九:
这种问题一般就2种方式,1是用正则;2是一个一个字母遍历下去找初始匹配依次类推.
解决方案十:
up~正则
解决方案十一:
如果不考虑性能问题,也可以简单点先用String.IndexOf()取得第一个"stop_name="的索引,然后把后面的内容截取出来;再把前面已经截取的部分SubString掉,对剩下的内容继续执行String.IndexOf()直到没有匹配伪代码如下:Strings="..........html内容........";inti=0;while(s.IndexOf("stop_name=")>=0){......}
解决方案十二:
用split,"stop_name="为分割关键字
解决方案十三:
up正则
解决方案十四:
stringcontent="<ahref="line_more.jsp?stop_name=十四中"target="_blank">";stringregex="<a[\s\S]+?stop_name=(?<keyword>.*?)"[\s\S]+?>";System.Text.RegularExpressions.RegexOptionsoptions=((System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace|System.Text.RegularExpressions.RegexOptions.Multiline)|System.Text.RegularExpressions.RegexOptions.IgnoreCase);System.Text.RegularExpressions.Regexreg=newSystem.Text.RegularExpressions.Regex(regex,options);System.Text.RegularExpressions.MatchCollectionresultes=reg.Matches(content);foreach(System.Text.RegularExpressions.Matchiteminresultes){//item.Groups["keyword"].Value就为其stop_name的值//Response.Write(item.Groups["keyword"].Value);//MessageBox.Show(item.Groups["keyword"].Value);}