积极答复者
请教C#如何提取html里面标签的值

问题
-
<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 错误
答案
-
可以考虑开源的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!
- 已建议为答案 Jason Dot WangModerator 2012年7月5日 6:51
- 已标记为答案 Jason Dot WangModerator 2012年7月10日 8:00
-
你好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);
}
}}
- 已建议为答案 Jason Dot WangModerator 2012年7月5日 6:51
- 已标记为答案 yyyukai 2012年7月5日 9:41
-
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
- 已标记为答案 Jason Dot WangModerator 2012年7月9日 9:51
全部回复
-
如果你是直接通过httpwebrequest 请求获取这个,可以使用正则表达式来匹配读取内容。
如果是web browser 你还可以使用 webBrowser的Document.GetElementById("控件ID") 来读取这个控件值。
如果你是web,在请求的时候这些内容可以通过get或者post 传递给服务器,在服务器端很简单的访问的到。
family as water
- 已建议为答案 Jason Dot WangModerator 2012年7月5日 6:51
- 取消建议作为答案 Jason Dot WangModerator 2012年7月10日 8:00
-
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 不知道用什么方法比较好,初次接触希望能给出相关代码 谢谢 -
可以使用DOM的g
e t E l e m e n t s B y T a g N a m e方法,g e t E l e m e n t s B y T a g N a m e("input")[0]访问第一个input,定义一个变量var,var=g e t E l e m e n t s B y T a g N a m e("input")[0].value就获取了第一个input的value值。然后你可以通过某个事件什么的触发,将这个var变量(实际上是一个数组)拉出来使用了。(注意,这是javascript) - 已建议为答案 Jason Dot WangModerator 2012年7月5日 6:51
-
可以考虑开源的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!
- 已建议为答案 Jason Dot WangModerator 2012年7月5日 6:51
- 已标记为答案 Jason Dot WangModerator 2012年7月10日 8:00
-
你好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);
}
}}
- 已建议为答案 Jason Dot WangModerator 2012年7月5日 6:51
- 已标记为答案 yyyukai 2012年7月5日 9:41
-
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条。。。。。 -
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
- 已标记为答案 Jason Dot WangModerator 2012年7月9日 9:51