【发布时间】:2016-10-07 22:58:43
【问题描述】:
我有一个大的 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 里面,还有其他元素可以是任何东西。
- 我尝试使用 HtmlDocument 和 XmlDocument 来加载此文件,但文件太大,导致出现内存不足异常
- 我尝试使用 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 中吗?
谢谢。
【问题讨论】:
-
您是否尝试过使用仅转发的
XmlReader或XPathNavigator方法? -
XPathNavigator 得到我的投票;它应该具有最低的内存占用,因为您正在查询文件而不是将整个内容加载到内存中。
-
我遇到了 XPathNavigator 的问题。像“十六进制值 0x0C,是无效字符”之类的东西。要解决它,它需要使用 Regex.Replace... 但我得到了内存不足异常... (stackoverflow.com/questions/21053138/…) 所以,我使用了 XmlReader 并且它正在工作:) 谢谢!