1

我正在尝试在 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>&nbsp;&raquo;
</div> 
4

2 回答 2

6

为什么有这么多反对票?因为您不会使用正则表达式解析 HTML,所以不允许他?这是非常狭隘的。

我已经看到 htmlagilitypack 无法正确解析格式严重错误的 html 文档,或者无法解析来自大量捕获的连接或嵌套的 HTML 文档的大部分时间。或者任何形式的 XPath 都不起作用,因为 HTML 文档是动态创建的,不一致,并且不一定包含标识属性。当一个非常简单的正则表达式无论如何都可以更可靠时,为什么要导入额外的包含并解决草率的标记?

如果您有一个大型项目,而您的项目中的一个方法只需要提取输入 HTML 文档的 DIV 的内容,该怎么办?它不是一个完整的 HTML 解析项目,只需要一个正则表达式。你的答案是包含更多的导入并为此构建一个全新的框架?我每年做数百个项目。一半使用 DOM/XPath,另一半根本不能,并且需要正则表达式。

总之,不要那么狭隘。参考 XPath/DOM 工具,但有助于回答问题。不要只是投反对票。我们不是尼安德特人,他们需要一直嘲笑很久以前发表的古老的“不要用正则表达式解析 HTML”帖子。

答案如下:

首先,单纯的:

(?s)<div.*?>(.*?)</div>

需要一个特别命名的 div?

(?s)<div[^>]*?class="txt-block"[^>]*?>(.*?)</div>

想要节省 CPU 并避免不必要的回溯?

<div[^>]*?class="txt-block"[^>]*?>(([^<]*(?(?!</div>)<))*)</div>

以上假设您没有嵌套的 DIV 项目。这就是不使用 Regex 的整个想法真正发挥作用的时候。除非您使用 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 不支持平衡组,这是一种 .Net 风格。

于 2013-05-08T14:43:42.420 回答
0

用正则表达式解析 HTML 不是一个好主意。尝试在 c# 中查找用于解析 HTML 的库。

经过快速搜索,我想出了这个库:http ://htmlagilitypack.codeplex.com/看来这个库有你需要的所有功能。

于 2013-05-08T12:42:02.317 回答