获取2个html标签之间的文本c#
Posted
技术标签:
【中文标题】获取2个html标签之间的文本c#【英文标题】:Get text between 2 html tags c# 【发布时间】:2012-06-26 22:20:43 【问题描述】:我正在尝试获取提供的 html (span) 之间的数据(在本例中为 31)
这是原始代码(来自 chrome 中的检查元素)
<span id="point_total" class="tooltip" oldtitle="Note: If the number is black, your points are actually a little bit negative. Don't worry, this just means you need to start subbing again." aria-describedby="ui-tooltip-0">31</span>
我有一个包含页面源的富文本框,这里是相同的代码,但在富文本框的第 51 行:
<DIV id=point_display>You have<BR><SPAN id=point_total class=tooltip jQuery16207621750175125325="23" oldtitle="Note: If the number is black, your points are actually a little bit negative. Don't worry, this just means you need to start subbing again.">17</SPAN><BR>Points </DIV><IMG style="FLOAT: right" title="Gain subscribers" border=0 src="http://static.subxcess.com/images/page/decoration/remove-1-point.png"> </DIV>
我该怎么做呢?我尝试了几种方法,但似乎都不适合我。
我正在尝试从此页面检索点值:http://www.subxcess.com/sub4sub.php 该数字会根据您的订阅者而有所不同。
【问题讨论】:
如果您需要在代码隐藏中访问它,您可以将“runat=server”添加到您的跨度并获取内部文本。 你可以使用 jquery 解决方案吗? var yourdata = $('span').html(); 我编写的程序是用 C# 编写的,因为我对它相当陌生,请您解释一下 jquery 解决方案是什么意思?我尝试了一些我在网上找到的正则表达式方法,我也尝试使用 HTMLAgility 库来查找字符串 您试图在哪里访问这些数据?在代码隐藏的c#代码中还是在客户端主动? 【参考方案1】:你可以非常具体:
var regex = new Regex(@"<span id=""point_total"" class=""tooltip"" oldtitle="".*?"" aria-describedby=""ui-tooltip-0"">(.*?)</span>");
var match = regex.Match(@"<span id=""point_total"" class=""tooltip"" oldtitle=""Note: If the number is black, your points are actually a little bit negative. Don't worry, this just means you need to start subbing again."" aria-describedby=""ui-tooltip-0"">31</span>");
var result = match.Groups[1].Value;
【讨论】:
这对我有用,除了我应该在原始帖子中提到的一件事,值会发生变化,因此它并不总是等于 31【参考方案2】:您需要使用HtmlAgilityPack 来执行此操作,这很简单:
HtmlDocument doc = new HtmlDocument();
doc.Load("filepath");
HtmlNode node = doc.DocumentNode.SelectSingleNode("//span"); //Here, you can also do something like (".//span[@id='point_total' class='tooltip' jQuery16207621750175125325='23' oldtitle='Note: If the number is black, your points are actually a little bit negative. Don't worry, this just means you need to start subbing again.']"); to select specific spans, etc...
string value = node.InnerText; //this string will contain the value of span, i.e. <span>***value***</span>
正则表达式虽然是一个可行的选择,但您通常希望尽可能避免解析 html(请参阅 Here)
在可持续性方面,您需要确保了解页面源(即,刷新几次并查看每次刷新后您的目标跨度是否嵌套在同一个父级中,确保页面是以相同的通用格式等...,然后使用上述原则导航到跨度)。
【讨论】:
这段代码对我有用,除了它总是显示相同的数字,不管实际值是多少 您确定要重新加载页面源代码吗? 是的,我有一个计时器设置为每 5 秒刷新一次源 感谢您将我重定向回 HTML Agility Pack,这是我过去使用过的东西。我刚刚添加了参考,并在我自己的项目中使用了您的代码作为起点。我想为任何其他后来者添加的唯一一件事是确保并指定类型以防止歧义。我注意到 '.Load()' 直到我更改为 'HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();'【参考方案3】:有多种可能性。
-
Regex
让HTML被解析为XML并通过XPath获取值
遍历所有元素。如果您使用跨度标记,请跳过所有字符,直到找到结束的“>”。那么你需要的值就是下一次开场前的一切 '
也看System.Windows.Forms.HtmlDocument
【讨论】:
以上是关于获取2个html标签之间的文本c#的主要内容,如果未能解决你的问题,请参考以下文章
从 BeautifulSoup 4.6 中的两个 HTML 标签之间提取 HTML
在 Selenium WebDriver 上,如何从文本标签内的标题标签中获取文本
如何使用 selenium Web 驱动程序 python 在 html 中的标签之间添加标签