从大型html文件中获取元素

本文关键字:获取 元素 文件 大型 html | 更新日期: 2023-09-27 18:12:02

我有一个大的html文件(80个),像:

<html>
   <head>...</head>
   <body>
      <div class="nothing">...</div>
      <div class="content">
         <h1>Hello</h1>
         <div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
         </div>
         <div>
            <div class="phone">
               ...
               <div>
                  ...
               </div>
               ...
            </div>
            <div class="phone"> ... </div>
         </div>
         <div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
            <div class="phone"> ... </div>
         </div>
      </div>
   </body>
</html>

我不能手动修改这个html文件,所以最好是保持只读。

我想将<div class="phone"> ... </div>的每一行存储在字符串表中,以便以后能够对其进行操作。在这个div中,还有其他元素可以是任何元素

  1. 我试图使用HtmlDocument和XmlDocument来加载这个文件,但文件是如此之大,我得到一个内存不足的异常
  2. 我试图使用Regex在一个表中获得所有这些元素,但我无法管理它。

我使用的正则表达式是:

Regex.Matches(myHtml, "<div class='"phone'">[''p{L}''s]*'',*[''p{L}''s]*<div");

这个正则表达式取每个

<div class="phone"> ANY UTF8 char </div>

但问题是:这个正则表达式接受所有UTF8字符,直到它找到下一个</div>,但这个结束div不一定是第一个开始div的结束div。

你知道我该怎么做吗?难道我们不能把这个文件切成不同的字符串,以便能够在htmlDocument中加载吗?

谢谢。

从大型html文件中获取元素

可以使用XmlReader类读取文件。XmlReader不将整个文件加载到内存中,但允许您在动态解析文档时逐个节点地遍历XML文档。

示例:读取class = phone:

所有div的内容
using (XmlReader reader = XmlReader.Create(@"C:'A.html"))
{
     // Loop over all xml tags 
     while (reader.Read())
     {
          // Check we have a div whith attribute class = phone
          if(reader.Name == "div" && reader.GetAttribute("class") == "phone")
          {
               // Yes, so read until the corresponding closing tag and output content
               textBox1.AppendText(reader.ReadInnerXml() + Environment.NewLine);
          }
     }
}

详细信息请参考文档

你可以用jQuery循环phone类的所有元素,并将它们存储在HiddenField中。然后在PostBack中,你可以访问这些值并处理它们。

<asp:HiddenField ID="HiddenField1" runat="server" />
<script type="text/javascript">
    function getValues() {
        var valueArray = new Array();
        var valueString = "";
        $(".phone").each(function (index, element) {
            //for demo store both in hiddenfield and javascript array
            valueArray.push(element.innerHTML);
            valueString += element.innerHTML + ",";
        });
        $("#<%=HiddenField1.ClientID %>").val(valueString);
    }
</script>

和code-behind:

    protected void Button1_Click(object sender, EventArgs e)
    {
        string valueString = HiddenField1.Value;
        if (!string.IsNullOrEmpty(valueString))
        {
            string [] valueArray = valueString.TrimEnd(',').Split(',');
            foreach (string s in valueArray)
            {
                //do stuff
            }
        }
    }