我尝试将该字符串保存为.xml文档,并使用XPathDocument导航器对其进行解析,但(惊讶吧)它无法很好地导航一个不真正是XML文档的文件。 正则表达式是实现我想要的功能的最佳方法吗?
我可以推荐使用HTML Agility Pack。我在需要解析HTML的几个情况下使用过它,效果非常好。一旦你将HTML加载到其中,就可以使用XPath表达式查询文档并获取锚点标签(以及其中的任何其他内容)。
HtmlDocument yourDoc = // load your HTML;
int someCount = yourDoc.DocumentNode.SelectNodes("your_xpath").Count;
正则表达式是一种方法,但可能会有问题。
大多数HTML页面不能使用标准的html技术进行解析,因为正如您发现的那样,大多数页面无法通过验证。
您可以花时间尝试集成HTML Tidy或类似工具,但构建所需的正则表达式会更快。
更新
在本次更新时,我收到了15个赞和9个踩。 我认为可能人们没有仔细阅读问题或此答案下的评论。 OP想要做的就是获取href值。就这些。从这个角度来看,一个简单的正则表达式就足够了。如果作者想要解析其他内容,那么我绝不会推荐正则表达式,正如我在开始时所说,这会带来问题。
在处理各种形式的HTML时,我更喜欢使用HTMLAgility包@ http://www.codeplex.com/htmlagilitypack。它允许您针对所需节点编写XPath,并将这些结果返回到集合中。
如果可能的话,最好不要重新发明轮子。一些很好的工具存在,可以将HTML转换为格式良好的XML,或者作为XmlReader:
以下是三个好工具:
TagSoup是一个开源程序,是由John Cowan开发的基于Java和SAX的工具。它是一个符合SAX标准的Java解析器,不像解析良好格式或有效XML,而是解析在实际应用中发现的HTML:糟糕、恶劣和残酷,但往往远非简短。TagSoup专为那些必须使用某种理性应用设计来处理这些内容的人而设计。通过提供SAX接口,它允许甚至将标准的XML工具应用于最糟糕的HTML。TagSoup还包括一个命令行处理器,可以读取HTML文件并生成干净的HTML或类似XHTML的规范XML。
Taggle是TagSoup的商业C++端口。
SgmlReader是由微软的Chris Lovett开发的工具。
SgmlReader是一个XmlReader API,适用于任何SGML文档(包括对HTML的内置支持)。还提供了一个命令行实用程序,可输出格式良好的XML结果。
下载包括独立可执行文件和完整源代码的zip文件:SgmlReader.zip
一个杰出的成就是David Carlisle编写的XSLT 2.0纯解析器。
我同意Chris Lively的观点,因为HTML通常不是很规范,所以最好使用正则表达式来处理。
href=[\"\'](http:\/\/|\.\/|\/)?\w+(\.\w+)*(\/\w+(\.\w+)?)*(\/|\?\w*=\w*(&\w*=\w*)*)?[\"\']
从这里开始,RegExLib应该能帮助你入门
如果您知道或可以修复文档,使其至少成为格式良好的文件,则使用xml可能会更加顺利。如果您有良好的html(或者更确切地说是xhtml),则.Net中的xml系统应该能够处理它。不幸的是,好的html非常少见。
另一方面,正则表达式在解析html时非常糟糕。幸运的是,您不需要处理完整的html规范。您所需要关注的全部内容都是解析href=
字符串以获取url。即使这也可能很棘手,因此我不会立即尝试。相反,我将首先询问一些问题,以尝试建立一些基本规则。 它们基本上都归结为“您对文档了解多少?”,但是在这里还有:
href=
也可能在文档中出现,而不属于锚标签)?href=
。 这会使您返回查找真正的锚标记,这意味着最好使用(非常宽松的)解析库。 您甚至可以尝试将其加载到Web浏览器控件中。 - Joel Coehoorn