none
请教C#如何提取html里面标签的值 RRS feed

  • 问题

  • <html>
    <head>
    <SCRIPT LANGUAGE="JavaScript" SRC="../include/js/function.js"></SCRIPT>
    <SCRIPT language="JavaScript" src="../include/js/select.js"></SCRIPT>
    <SCRIPT language=JavaScript src="../include/js/iOffice_Popup.js"></SCRIPT>
    <SCRIPT LANGUAGE='JavaScript' SRC="../include/js/formCheck.js"></SCRIPT>
    <link rel="stylesheet" href="../include/css/cqsStyle.css" type="text/css">
    <title>
    </title>
    		<script>alert("请重新登录!");parent.location.href="/index.jsp";</script>
    </head>
    <body bgcolor="#ffffff">
    <form name="myform" method="post" action="" target="_self">
    <input type="hidden" name="id" value="10">
    <input type="hidden" name="xwcmid" value="40">
    <p align="center" class="titleTd">用户</p>
      <table border="0" align="center" cellpadding="0" cellspacing="0" class="doTable">
        <tr>
          <td class="doTitle">帐号:</td>
          <td class="doData">
            <input name="ua" type="text" value="test" readonly size="20" maxlength="11" v_must="1" v_type=string v_name="帐号">
          </td>
        </tr>
        <tr>
          <td class="doTitle">密码:</td>
          <td class="doData">
            <input name="pw" type="text" value="test" size="20" maxlength="20" v_must="1" v_type=string v_name="密码">
          </td>
        </tr>
        <tr>
          <td class="doTitle">联系人:</td>
          <td class="doData">
            <input name="uname" type="text" value="XXX" size="20" maxlength="50" v_must="1" v_type=string v_name="联系人">
          </td>
        </tr>
    	<tr>
          <td class="doTitle">手机号:</td>
          <td class="doData">
            <input name="mobile" type="text" value="189" size="20" maxlength="50" v_must="1" v_type=string v_name="手机号">
          </td>
        </tr>
         <tr>
          <td class="doTitle">状态:</td>
          <td class="doData">
            
    	   	    <input type="radio" name="enable" value="0" >暂停
    	        <input type="radio" name="enable" value="1" checked>开启
    	   	  
          </td>
        </tr>
        <tr>
          <td class="doTitle">审核设置:</td>
          <td class="doData">
            
    </body>
    </html>
    <script language="javascript">
     function searchSubmit(){
        myform.saveFlag.value="1";
        myform.action="userEdit.jsp";
        myform.submit();
     }
      function addSubmit(ua){
      alert(ua);
        myform.action="userGwAdd.jsp?ua="+ua;
        myform.submit();
     }
      function delSubmite(ua){
        myform.action="userGwDel.jsp?ua="+ua;
        myform.submit();
     }
    </script>
    2012-07-02 22:52:29-- () :<!--XXXX XXX-XX-XX 修改  -->

    上这段就是html代码如何才能获取到这些 <input>里面value的值

    只要下面4个 请问如何读取出来!谢谢

    <input name="ua" type="text" value="test" readonly size="20" maxlength="11" v_must="1" v_type=string v_name="帐号">
    <input name="pw" type="text" value="test" size="20" maxlength="20" v_must="1" v_type=string v_name="密码">
    <input name="uname" type="text" value="唐" size="20" maxlength="50" v_must="1" v_type=string v_name="联系人">
    <input name="mobile" type="text" value="189" size="20" maxlength="50" v_must="1" v_type=string v_name="手机号">


    • 已编辑 yyyukai 2012年7月3日 1:31 错误
    2012年7月3日 1:30

答案

  • 可以考虑开源的HTML解析器,如HtmlAgilityPack(http://htmlagilitypack.codeplex.com/

    		public static string LocdHtmlString(string url, int timeout)
    		{
    			try
    			{
    				using (var responseStream = new StreamReader(CreatRequest(url, timeout).GetResponse().GetResponseStream()))
    				{
    					return responseStream.ReadToEnd();
    				}
    
    			}
    			catch (Exception ex)
    			{
    				throw ex;
    			}
    		}
    
    		private static WebRequest CreatRequest(string url, int timeout)
    		{
    			var request = (HttpWebRequest)WebRequest.Create(url);
    			request.Timeout = timeout;
    			request.UseDefaultCredentials = true;
    			//request.KeepAlive = false;
    			return request;
    		}
    在code里面
    var hDoc = HtmlDocumentLoader.LoadDocument(WebUrl, timeout);
    hDoc.DocumentNode.SelectSingleNode("XPATH HERE").InnerText.Trim()

    Hard work, hard play!

    2012年7月3日 2:47
  • 你好yyyKai;)

    1)首先把以下的代码放到<html>……</html>中去(因为你的Html不是很标准,无法解析);标准代码如下:

    <html>
    <head>
    </head>
    <body bgcolor="#ffffff">
    <form name="myform" method="post" action="" target="_self">
    <input type="hidden" name="id" value="10">
    <input type="hidden" name="xwcmid" value="40">
    <p align="center" class="titleTd">用户</p>
      <table border="0" align="center" cellpadding="0" cellspacing="0" class="doTable">
        <tr>
          <td class="doTitle">帐号:</td>
          <td class="doData">
            <input name="ua" type="text" value="test" readonly size="20" maxlength="11" v_must="1" v_type=string v_name="帐号">
          </td>
        </tr>
        <tr>
          <td class="doTitle">密码:</td>
          <td class="doData">
            <input name="pw" type="text" value="test" size="20" maxlength="20" v_must="1" v_type=string v_name="密码">
          </td>
        </tr>
        <tr>
          <td class="doTitle">联系人:</td>
          <td class="doData">
            <input name="uname" type="text" value="XXX" size="20" maxlength="50" v_must="1" v_type=string v_name="联系人">
          </td>
        </tr>
     <tr>
          <td class="doTitle">手机号:</td>
          <td class="doData">
            <input name="mobile" type="text" value="189" size="20" maxlength="50" v_must="1" v_type=string v_name="手机号">
          </td>
        </tr>
         <tr>
          <td class="doTitle">状态:</td>
          <td class="doData">
           
             <input type="radio" name="enable" value="0" >暂停
             <input type="radio" name="enable" value="1" checked>开启
          
          </td>
        </tr>
        <tr>
          <td class="doTitle">审核设置:</td>
          <td class="doData">
           
    </body>
    </html>

    2、然后直接使用WebBrowser动态解析:

    public partial class Form1 : Form
        {
            WebBrowser wb = new WebBrowser();

            public Form1()
            {
                InitializeComponent();
               
            }

            private void Form1_Load(object sender, EventArgs e)
            {
             
            }

            private void button1_Click(object sender, EventArgs e)
            {
              
                wb.DocumentCompleted += wb_DocumentCompleted;
                wb.Url = new Uri("c:\\try.html");
            }

            void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
               
                foreach (HtmlElement item in wb.Document.GetElementsByTagName("table")[0].GetElementsByTagName("input"))
                {
                    textBox1.Text+=(item.OuterHtml + Environment.NewLine);
                }
            }

        }


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月3日 3:54
    版主
  • Hi yyyukai,

      DOM 全称是 Document Object Model, 最早出现在Javascript标准里的一个对象模型,你还能接触到它的另个兄弟BOM,而其他工程师提供的这些方法要么是在winform中通过浏览器控件Webbrowser去抓取,要么在asp.net中用脚本获得,我觉得编程志愿者的回答很正确,你同样可以在微软的walkthrough中看到类似的回答。

     How to: Access the HTML Source in the Managed HTML Document Object Model 

      Walkthrough: Accessing the DHTML DOM from C# 

      希望这些链接能帮你弄清如何结合Webbrowser和DOM对象模型以便于去实现更多的需求。

     


    Jason Wang [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月5日 7:06
    版主

全部回复

  • 如果你是直接通过httpwebrequest 请求获取这个,可以使用正则表达式来匹配读取内容。

    如果是web browser 你还可以使用 webBrowser的Document.GetElementById("控件ID") 来读取这个控件值。

    如果你是web,在请求的时候这些内容可以通过get或者post 传递给服务器,在服务器端很简单的访问的到。


    family as water

    2012年7月3日 2:19
  • 个人思路可以用正则表达式扫到所有input然后再过来一下。

    另外既然html也有关闭标签不知道可不可以考虑把内容输出到一个xml然后反序列化呢?

    2012年7月3日 2:19
  • WebRequest wRequest = WebRequest.Create(url);
    WebResponse wResponse = wRequest.GetResponse();
    Stream stream = wResponse.GetResponseStream();
    StreamReader reader = new StreamReader(stream, System.Text.Encoding.Default);
    strRet = reader.ReadToEnd().Trim().ToString();

    这里的strRet就是返回的html 不知道用什么方法比较好,初次接触希望能给出相关代码 谢谢
    2012年7月3日 2:39
  • 可以使用DOM的getElementsByTagName方法,getElementsByTagName("input")[0]访问第一个input,定义一个变量var,var=getElementsByTagName("input")[0].value就获取了第一个input的value值。然后你可以通过某个事件什么的触发,将这个var变量(实际上是一个数组)拉出来使用了。(注意,这是javascript)

    2012年7月3日 2:41
  • 可以考虑开源的HTML解析器,如HtmlAgilityPack(http://htmlagilitypack.codeplex.com/

    		public static string LocdHtmlString(string url, int timeout)
    		{
    			try
    			{
    				using (var responseStream = new StreamReader(CreatRequest(url, timeout).GetResponse().GetResponseStream()))
    				{
    					return responseStream.ReadToEnd();
    				}
    
    			}
    			catch (Exception ex)
    			{
    				throw ex;
    			}
    		}
    
    		private static WebRequest CreatRequest(string url, int timeout)
    		{
    			var request = (HttpWebRequest)WebRequest.Create(url);
    			request.Timeout = timeout;
    			request.UseDefaultCredentials = true;
    			//request.KeepAlive = false;
    			return request;
    		}
    在code里面
    var hDoc = HtmlDocumentLoader.LoadDocument(WebUrl, timeout);
    hDoc.DocumentNode.SelectSingleNode("XPATH HERE").InnerText.Trim()

    Hard work, hard play!

    2012年7月3日 2:47
  • 你好yyyKai;)

    1)首先把以下的代码放到<html>……</html>中去(因为你的Html不是很标准,无法解析);标准代码如下:

    <html>
    <head>
    </head>
    <body bgcolor="#ffffff">
    <form name="myform" method="post" action="" target="_self">
    <input type="hidden" name="id" value="10">
    <input type="hidden" name="xwcmid" value="40">
    <p align="center" class="titleTd">用户</p>
      <table border="0" align="center" cellpadding="0" cellspacing="0" class="doTable">
        <tr>
          <td class="doTitle">帐号:</td>
          <td class="doData">
            <input name="ua" type="text" value="test" readonly size="20" maxlength="11" v_must="1" v_type=string v_name="帐号">
          </td>
        </tr>
        <tr>
          <td class="doTitle">密码:</td>
          <td class="doData">
            <input name="pw" type="text" value="test" size="20" maxlength="20" v_must="1" v_type=string v_name="密码">
          </td>
        </tr>
        <tr>
          <td class="doTitle">联系人:</td>
          <td class="doData">
            <input name="uname" type="text" value="XXX" size="20" maxlength="50" v_must="1" v_type=string v_name="联系人">
          </td>
        </tr>
     <tr>
          <td class="doTitle">手机号:</td>
          <td class="doData">
            <input name="mobile" type="text" value="189" size="20" maxlength="50" v_must="1" v_type=string v_name="手机号">
          </td>
        </tr>
         <tr>
          <td class="doTitle">状态:</td>
          <td class="doData">
           
             <input type="radio" name="enable" value="0" >暂停
             <input type="radio" name="enable" value="1" checked>开启
          
          </td>
        </tr>
        <tr>
          <td class="doTitle">审核设置:</td>
          <td class="doData">
           
    </body>
    </html>

    2、然后直接使用WebBrowser动态解析:

    public partial class Form1 : Form
        {
            WebBrowser wb = new WebBrowser();

            public Form1()
            {
                InitializeComponent();
               
            }

            private void Form1_Load(object sender, EventArgs e)
            {
             
            }

            private void button1_Click(object sender, EventArgs e)
            {
              
                wb.DocumentCompleted += wb_DocumentCompleted;
                wb.Url = new Uri("c:\\try.html");
            }

            void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
               
                foreach (HtmlElement item in wb.Document.GetElementsByTagName("table")[0].GetElementsByTagName("input"))
                {
                    textBox1.Text+=(item.OuterHtml + Environment.NewLine);
                }
            }

        }


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月3日 3:54
    版主
  • private void button_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < 50; i++)
                {
                    wb.Url = new Uri("url/userEdit.jsp?id=" + i);
    wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
                }
                        }
    void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                string str = "";
                for (int i = 0; i < wb.Document.GetElementsByTagName("table")[0].GetElementsByTagName("input").Count; i++)
                {
                    str += wb.Document.GetElementsByTagName("table")[0].GetElementsByTagName("input")[i].GetAttribute("value") + ",";
                }
                str = str.Substring(0, str.Length - 1);
                WriteEntry1(str);
            }

    我这样的代码怎么 循环50次 获取出来的都是id为49的信息 还是50条。。。。。
    2012年7月3日 8:03
  • 请按照我的做法,我完全可以的。

    请记住——因为你的Html很不规范,请按照我的格式先排版再说,否则无法解析的。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月3日 8:08
    版主
  • 现在解析是正常的 就是我有增加了一个循环!

    for (int i = 0; i < 50; i++)
               
    {
                    wb
    .Url = new Uri("url/userEdit.jsp?id=" + i);
    wb
    .DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
               
    }
    但是每次循环解析出来的东西都是i=49的时候的值,0-48的值都没读取出来!

    2012年7月3日 8:17
  • 是啊,你每次都刷新页面(在for循环中)。这样直接导致因为for的速度远远大于页面Load的速度,当然你只能获取最后一个页面请求的内容了。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月3日 8:21
    版主
  • 哦 这样啊!有什么办法 处理这个问题吗?
    2012年7月3日 8:26
  • 哦 这样啊!有什么办法 处理这个问题吗?

    创建一个数组(49个WebBrowser),在for中分别对应不同的对象。然后在不同的DocumentCompleted中处理。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月3日 8:30
    版主
  • 你打方法是异步吧! 不知道用同步会不会就不出现这个问题!

    2012年7月3日 8:31
  • 你打方法是异步吧! 不知道用同步会不会就不出现这个问题!


    就是同步来不及相应才出现问题。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月3日 8:33
    版主
  • 这样啊! 俺真实小菜。。。。。。。。。。
    2012年7月3日 8:35
  • 哦 这样啊!有什么办法 处理这个问题吗?

    创建一个数组(49个WebBrowser),在for中分别对应不同的对象。然后在不同的DocumentCompleted中处理。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    这个方法怎么实现,我试了几次都不成功!
    2012年7月4日 2:34
  • 定义一个数组,每个数组元素都是一个WebBrowser;同时在循环中绑定DocumentCompleted事件,在事件中自行处理啊。

    还有请以后说话不要用感叹号,貌似你发脾气一样……:(


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月4日 2:38
    版主
  • 定义一个数组,每个数组元素都是一个WebBrowser;同时在循环中绑定DocumentCompleted事件,在事件中自行处理啊。

    还有请以后说话不要用感叹号,貌似你发脾气一样……:(


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    没那个意思,只是有时候遇到问题解决不了比较心急,不好意思。
    2012年7月4日 2:41
  • 要不请给出你的一些代码,不过我认为你还是换一个思路,因为你要解析的html实在太多,用一个WebBrowser肯定不行。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年7月4日 2:57
    版主
  • 其实我自己也不知道什么方法比较好是第一次 接触通过url来获取html并且解析得到相应的参数,这个html确实很不标准,我只能按照你的这个方法来操作,不知你有没更好的处理办法   O(∩_∩)O哈哈
    2012年7月4日 7:59
  • Hi yyyukai,

      DOM 全称是 Document Object Model, 最早出现在Javascript标准里的一个对象模型,你还能接触到它的另个兄弟BOM,而其他工程师提供的这些方法要么是在winform中通过浏览器控件Webbrowser去抓取,要么在asp.net中用脚本获得,我觉得编程志愿者的回答很正确,你同样可以在微软的walkthrough中看到类似的回答。

     How to: Access the HTML Source in the Managed HTML Document Object Model 

      Walkthrough: Accessing the DHTML DOM from C# 

      希望这些链接能帮你弄清如何结合Webbrowser和DOM对象模型以便于去实现更多的需求。

     


    Jason Wang [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月5日 7:06
    版主
  • 谢谢 !!!
    2012年7月5日 9:41
  • Request.Params["input中的name"] 通过这种方式就可以获取到了~

    2012年7月20日 4:00