我正试图在c#中刮掉整个div元素。
我已经尝试了div class="txt-block"\s*(.+?)(\r\n?|\n)\s*"
但它并没有把它全部刮掉:(
有任何想法吗?
这是div .. THX!
<div class="txt-block" itemprop="creator" itemscope itemtype="http://schema.org/Person">
<h4 class="inline">Writers:</h4>
<a href="/name/nm1318843/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop" itemprop="name">Mark Fergus</span></a> (screenplay),
<a href="/name/nm1319757/?ref_=tt_ov_wr" itemprop='url'><span class="itemprop"
itemprop="name">Hawk Ostby</span></a> (screenplay), <a href="fullcredits?ref_=tt_ov_wr#writers" >6 more credits</a> »
</div>
答案 0 :(得分:5)
为什么这么多的选票呢?因为你不会用正则表达式解析HTML,他是不允许的?那是非常狭隘的。
我已经看到很多时候htmlagilitypack无法正确解析可怕的格式错误的html文档,或者无法从大量捕获中解析连接或嵌套的HTML文档。或者任何形式的XPath都不起作用,因为HTML文档是动态创建的,不一致,并且不一定包含标识属性。当一个非常简单的正则表达式更加可靠时,为什么要导入额外的包含并解决草率标记?
如果您有一个大型项目,项目中的单个方法只需要提取输入HTML文档的DIV内容,该怎么办?它不是一个完整的HTML解析项目,只需要一个正则表达式。您的答案是包含更多导入并为此构建一个全新的框架?我每年做数百个项目。一半使用DOM / XPath,另一半根本不能,并且需要Regex。
总之,不要那么狭隘。参考XPath / DOM工具,但有助于回答问题。不要只是投票。我们不是尼安德特人,他们需要一直嘲笑古老的“不要用正则表达式解析HTML”的帖子。
答案如下:
首先,单纯的一个:
(?s)<div.*?>(.*?)</div>
需要一个特别命名的div?
(?s)<div[^>]*?class="txt-block"[^>]*?>(.*?)</div>
想要节省CPU并避免不必要的回溯?
<div[^>]*?class="txt-block"[^>]*?>(([^<]*(?(?!</div>)<))*)</div>
以上假设您没有嵌套的DIV项目。那就是不使用正则表达式的整个想法真正发挥作用。除非您使用的是C#.Net。在这种情况下,你只需要这样做:
(?xm)
(?>
<(?<Tagname>div)[^>]*?class="txt-block"[^>]*>
)
(?(Tagname)
(
</(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
|
(?>
<(?<Tagname>[a-z][^\s>]*)[^>]*>
)
|
[^<]+
)+?
(?(Tagname)(?!))
)
或者,单行版本:
(?m)(?><(?<Tagname>div)[^>]*?class="txt-block"[^>]*>)(?(Tagname)(</(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)|(?><(?<Tagname>[a-z][^\s>]*)[^>]*>)|[^<]+)+?(?(Tagname)(?!)))
选择你的毒药。正则表达式比人们想象的更强大,更可靠。我发布的最复杂的例子在Regex Buddy中不起作用,但可以在任何.Net框架中使用。 Regex Buddy不支持Balancing Groups,这是一种.Net风格。
答案 1 :(得分:0)
使用正则表达式解析HTML并不是一个好主意。尝试在c#中找到用于解析HTML的库。
在我quick search之后我想出了这个库:http://htmlagilitypack.codeplex.com/看来这个库具有你需要的所有功能。