C# 从html文档中提取html片段

C# 从html文档中提取html片段,c#,html,vb.net,text,C#,Html,Vb.net,Text,我正在寻找一种从html文档中提取html“片段”的有效方法。我的团队使用了Html敏捷包。这似乎是解决这个问题的一种合理方法,直到我开始在大型html文档上运行提取-对于如此琐碎的东西来说,性能非常差(我猜是因为解析整个文档所花费的时间) 有人能提出一个更有效的方法来实现我的目标吗 总结如下: <html> <head> <title>blah</title> </head> <body>

我正在寻找一种从html文档中提取html“片段”的有效方法。我的团队使用了Html敏捷包。这似乎是解决这个问题的一种合理方法,直到我开始在大型html文档上运行提取-对于如此琐碎的东西来说,性能非常差(我猜是因为解析整个文档所花费的时间)

有人能提出一个更有效的方法来实现我的目标吗

总结如下:

<html>
   <head>
     <title>blah</title>
   </head>
   <body>
    <p>My content</p>
   </body>
</html>
<p>My content</p>
  • 就我而言,一个html“片段” 定义为中的所有内容 html的
    标记 文件

  • 理想的情况下,我想退回 如果没有,内容将保持不变 包含
    (我假设我通过了一个html (以片段开头)

  • 我在内存中有完整的html文档(作为一个字符串),我不会按需对其进行流式处理,因此潜在的解决方案不需要担心这一点

  • 性能至关重要,因此潜在的解决方案应该考虑到这一点

  • 样本输入:

    <html>
       <head>
         <title>blah</title>
       </head>
       <body>
        <p>My content</p>
       </body>
    </html>
    
    <p>My content</p>
    
    
    废话
    我的内容

    所需输出:

    <html>
       <head>
         <title>blah</title>
       </head>
       <body>
        <p>My content</p>
       </body>
    </html>
    
    <p>My content</p>
    
    我的内容


    欢迎使用C#或VB.NET解决方案。

    您可以使用控件对其进行破解,并利用
    webBrowser1.document
    属性(尽管不确定您试图实现什么)。

    如果我没记错的话,我过去使用
    XPathNavigator
    做过类似的事情。我想是这样的:

            XPathDocument xDoc = new System.Xml.XPath.XPathDocument(new StringReader(content));
            XPathNavigator xNav = xDoc.CreateNavigator();
            XPathNavigator node = xNav.SelectSingleNode("/body");
    

    您可以将
    /body
    更改为您需要查找的任何内容。

    大多数html都不会兼容XHTML。我将执行一个HTTP get请求,并在结果文本中搜索
    .Contains(“”
    .Contains(“”
    )。您可以使用这两个位置作为读卡器流的开始和停止索引。在body标记之外,您真的不需要担心XML遵从性。

    Brad,我假设这不会比使用Html Agility Pack快多少;我在这里寻找一个性能解决方案,可能涉及直接操作我收到的文本。这是一个很好的方法,但您必须非常小心,您的HTML符合XHTML,并且不包括令人讨厌的未关闭标记,具体如。这看起来是一个合理的解决方案(我需要测试性能以确保),但正如汤姆所说;我可能无法假设我得到的html是XHTML兼容的;我知道我曾经遇到过这样的情况,我必须添加一个根节点以使我的输入兼容,但我能够使它工作;我们可以假设我在内存中有整个html文档字符串;所以我不会点播。我已经相应地更新了我的问题。到目前为止,这是执行OP要求的最快的方式。而且您不需要读者流。只需一个包含HTML的常规字符串就可以了。这似乎是一个非常合理的方法,今天稍后我将对此进行一次尝试。与我最初的实现相比,这提供了非常好的性能结果;也许没有那么安全——但这不是我们的目标。