当前位置:编程学习 > C#/ASP.NET >>

高手请进,救急!!!!谢谢

  这是我做的用C#提取web信息的一段程序,但是网页的源文件是表格里嵌表格,所以比较难提取源码数据,请高手帮忙看一下,可以加我好友,我把我要提取信息的网站给你,谢谢!!!           
          private void button1_Click(object sender, EventArgs e)
        {
           //要抓取的URL地址
            string Url = textBox1.Text;
            //得到指定Url的源码
            string strWebContent = GetWebContent(Url);
            //rtxtHtmlSrc.Text = strWebContent
            //取出和数据有关的那段源码
              int iBodyStart = strWebContent.IndexOf("colspan=13", 0);
            int iStart = strWebContent.IndexOf("</table>", iBodyStart);
            int iTableStart = strWebContent.IndexOf("<tr", iStart);
            int iTableStartb = strWebContent.IndexOf("3E89C0", iTableStart);
            int iTableEnd = strWebContent.IndexOf("</table>", iTableStartb);
            string strWeb = strWebContent.Substring(iTableStart, iTableEnd - iTableStartb); 

            //生成HtmlDocument
            WebBrowser webb = new WebBrowser();
            webb.Navigate("about:blank");
            HtmlDocument htmldoc = webb.Document.OpenNew(true);
            htmldoc.Write(strWeb);
            HtmlElementCollection htmlTR = htmldoc.GetElementsByTagName("TR");
            foreach (HtmlElement tr in htmlTR)
            {
                string strID = tr.GetElementsByTagName("TD")[0].InnerText;
                string strName = tr.GetElementsByTagName("TD")[1].InnerText;
                //插入DataTable
                AddLine(strID, strName, "0");
                ////插入数据库
                //InsertData(dt);
                dataGridView1.DataSource = dt.DefaultView;
            }
            --------------------编程问答-------------------- up --------------------编程问答-------------------- 分析字符串没什么难度
就是麻烦点~~~

可以考虑正则或者把它弄成XML --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- <td height="30" colspan="6"><font color="#FFFFFF">1/K1 平海路→小河路登云路口</font></td>
                    </tr>
                    <tr align="center" valign="top" bgcolor="FFECC3"> 
                      <td width="5%" height="30">序号</td>
                      <td width="17%" height="30">站点名称<br>
                        Bus Stops Name </td>
                      <td width="46%" height="30">经过线路<br>
                        Buslines Passing By </td>
                      <td width="12%" height="30">副站名<br>
                        Subname Of The Busstop </td>
                      <td width="20%" height="30">辅助标注站名<br>
                        Supplementary Name of Bus Stops </td>
                    </tr>
                    
                    <tr align="center" bgcolor="ECF4F9"> 
                      <td height="30">1</td>
  <td height="30">
                        <table width="100%" border="0" cellspacing="0" cellpadding="0">
                          <tr> 
                            <td width="44%" align="center"> 
                              
                            平海路</td>
                          </tr>
                        </table>
                      </td>
                      <td height="30"> 
  <table border=0 width="100%"><tr>
  
<td width="25%" align="center"><a href="line_search.jsp?line_id=3&line_name=K4" target="_blank">K4</a></td>

<td width="25%" align="center"><a href="line_search.jsp?line_id=895&line_name=27" target="_blank">27/K27</a></td>

<td width="25%" align="center"><a href="line_search.jsp?line_id=1307&line_name=K16" target="_blank">K16</a></td>

<td width="25%" align="center"><a href="line_search.jsp?line_id=1321&line_name=K286" target="_blank">K286</a></td>

  </tr>
  
<tr><td colspan="25%" align="right"><a href="line_more.jsp?stop_name=平海路" target="_blank">更多线路</a></td></tr>
  
</table>
                      </td>
<td height="30"> 
                        市总工会
                      </td>
                      <td height="30"> 
                        
                      </td>
                    </tr>
  
                    <tr align="center" bgcolor="ECF4F9"> 
                      <td height="30">2</td>
  <td height="30">
                        <table width="100%" border="0" cellspacing="0" cellpadding="0">
                          <tr> 
                            <td width="44%" align="center"> 
                              
                            十四中</td>
                          </tr>
                        </table>
                      </td>
                      <td height="30"> 
  <table border=0 width="100%"><tr>
  
<td width="25%" align="center"><a href="line_search.jsp?line_id=1246&line_name=K73" target="_blank">K73</a></td>

<td width="25%" align="center"><a href="line_search.jsp?line_id=1257&line_name=49" target="_blank">49/K49</a></td>

<td width="25%" align="center"><a href="line_search.jsp?line_id=1793&line_name=45" target="_blank">45/K45</a></td>

<td width="25%" align="center"><a href="line_search.jsp?line_id=1913&line_name=1" target="_blank">1/K1</a></td>

  </tr>
  
<tr><td colspan="25%" align="right"><a href="line_more.jsp?stop_name=十四中" target="_blank">更多线路</a></td></tr>
  
</table> --------------------编程问答-------------------- 这些是其中的一小段,下面还很多,我想提取的是stop_name=??后面??的内容,比如平海路,十四中,希望高手可以指点,谢谢..
--------------------编程问答-------------------- 用正则吧,比较方便 --------------------编程问答-------------------- 用正则来匹配就很容易提取了 --------------------编程问答-------------------- 这种问题一般就2种方式,1是用正则;2是一个一个字母遍历下去找初始匹配依次类推. --------------------编程问答-------------------- up~正则 --------------------编程问答-------------------- 如果不考虑性能问题,也可以简单点
先用String.IndexOf() 取得第一个"stop_name="的索引,然后把后面的内容截取出来;再把前面已经截取的部分SubString掉,对剩下的内容继续执行String.IndexOf() 直到没有匹配

伪代码如下:
String s = "..........html内容........";
int i = 0;
while(s.IndexOf("stop_name=")>=0)
{
......
} --------------------编程问答-------------------- 用split,"stop_name=" 为分割关键字 --------------------编程问答-------------------- up 正则 --------------------编程问答--------------------


string content = "<a   href=\"line_more.jsp?stop_name=十四中\"   target=\"_blank\"> ";
            string regex = "<a[\\s\\S]+?stop_name=(?<keyword>.*?)\"[\\s\\S]+?>";
            System.Text.RegularExpressions.RegexOptions options = ((System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace | System.Text.RegularExpressions.RegexOptions.Multiline) 
                        | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regex, options);

            System.Text.RegularExpressions.MatchCollection resultes = reg.Matches(content);
            foreach (System.Text.RegularExpressions.Match item in resultes)
            {
                //item.Groups["keyword"].Value就为其stop_name的值
                //Response.Write(item.Groups["keyword"].Value);
                //MessageBox.Show(item.Groups["keyword"].Value);
            }


补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,