【问题标题】:How to retrieve data from an html string from a span tag by using Regular Expressions?如何使用正则表达式从 span 标签的 html 字符串中检索数据?
【发布时间】:2015-05-14 16:54:05
【问题描述】:

我需要从 html 文档中检索一些信息,因为获取 json 或 xml 的 Web 服务还没有准备好。我正在使用 c# 并使用正则表达式从 html 字符串中获取我需要的数据。我已经设法从整个 html 字符串中获取我想要使用的 div,但现在我无法获取第一个 span 标签之间的信息。 我试图检索 ; 之间的数据和第一个结束跨度标签,但我真正想要的是第一个跨度标签之间的内容。

这是我到目前为止写的正则表达式,但它不起作用:

".*;(?<Content>(\r|\n|.)*)</span>"

我也试过了,但也没有用:

"<span class=""type"">(?<Content>(\r|\n|.)*)</span>"

这是我要从中检索数据的 div:

<div class="main">ABASASDFÓ 18/06/2014 17:38h&nbsp; Blabla Balbal&nbsp; <span class="type">15.80&#8364;&nbsp; </span>+1.94 % +0.30&#8364; &nbsp;|&nbsp;HOME <SPAN class="type2">11,398.70</span>&nbsp; +0.65 % +74.10</div>

编辑:我不能使用 Htmlagilitypack,因为我的客户不希望我们使用任何外部库。我也听说过使用 XmlReader,但我不确定 html 的结构是否会相应地匹配 xml。

【问题讨论】:

  • 正则表达式和 HTML? Hm。无论如何,你的括号不匹配。
  • 大声笑,对不起,伙计。我有点困。我更新了我的正则表达式,但问题始终如一-.-仍然无法正常工作:(
  • 与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?。顺便说一句,这是“提前致谢”,而不是“致谢”。

标签: c# html regex xml-parsing


【解决方案1】:

这个正则表达式将捕获字符串:

"<span class=\"type\">(?<Content>([^<]*))</span>"

虽然,我同意其他答案,但您应该使用 Path 之类的东西而不是 Regexes 来解析 html。

【讨论】:

  • 你能给我一些关于 Path 的线索吗?也许一些链接,所以我可以检查它,不要再打扰你了:D?
  • 这是一个开始的链接。在您的情况下,表达式应该是这样的:“//div/span[@class='type']”。这是一个如何在.NET中使用它的示例codeproject.com/Articles/9494/…
【解决方案2】:

这是在 Javascript 中使用正则表达式的方法。你应该能够很容易地为 C# 调整它。

var inner = html.match( /<span class="type"(?:\s+[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)))*\s*>([\S\s]*)<\/span>/i)[1];

小提琴:http://jsfiddle.net/GarryPas/uk32r8vz/

【讨论】:

  • 感谢您的回答!但是你在这里实现的是删除每个我觉得非常有用的 html 标签,但我实际上想特别针对第一个 span 标签。
  • 对 XmlReader @garryp 有什么想法吗?
  • 只要您确定您将使用有效的 HTML,它就更简洁,并且可能更健壮。老实说,我会试图说服您的客户,让他们允许您使用像 HTMLAgility 这样的成熟库,而不是要求您重新发明轮子。无论您采用哪种解决方案,自己滚动都会很痛苦。
【解决方案3】:

您想为此使用 XPath。像这样的:

div/span/text()

我知道您的解决方案中不希望有一些外部 3rd 方库,解决方案是去获取整个库的源代码:
https://htmlagilitypack.codeplex.com/
现在您没有外部库,您有一个内部库,您可以使用正确的工具来完成这项工作!

XmlReader 是一个相当低级的工具,从技术上讲,它可以为您完成这项工作,但您更需要的是“使用 XmlReader 执行 XPath”,这里谈到:https://msdn.microsoft.com/en-us/library/ms950778.aspx

XPathReader 类是所有这些的结果,它已被 LINQ to XML 取代:https://msdn.microsoft.com/en-ca/library/bb387098.aspx

所以这里的另一个选择是尝试使用一些 LINQ 来处理您的 HTML 文件,但这可能会很棘手,因为 HTML 不是好的 XML。不过,如果您正在寻找这些,这是另一种选择。

【讨论】:

  • 感谢您的回答!这可能是一个可能的解决方案。无论如何,你认为我的一段 html 可以用 XmlReader 解析吗?
  • 我确信它可以,但我已将我对此事的全部想法添加到我的回答中。
  • 非常感谢!我去查一下rn!没有阅读您的编辑。
  • 不客气。如果可以使用,我希望 LINQ to XML 将成为您武器库中的强大工具。我知道我会寻找机会自己使用它。
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2020-08-04
  • 2011-11-05
  • 1970-01-01
  • 2013-10-14
相关资源
最近更新 更多