使用正则表达式从html中提取[visual basic]

时间:2015-03-01 15:30:54

标签: html regex vb.net

我有一个关于使用正则表达式从html页面中提取的问题。我使用的正则表达式应该从跨度中提取(所有4个),但它不起作用。请查看我尝试的代码以及我要提取的HTML标记。

HTML

<div class="content-wrapper">

    <a class="klose"href="https://www.anysiteAtall.com">
        <span class="title">The good big book</span>
        <span id="place" class="country">America</span>
        <span class="price">$300</span>
        <span class="color">white</span>
    </a>
</div>

我的代码

   Dim span_matchsingle As New Regex(
       "<span[^<>]*class=""color""[^<>]*>(?<meTIT>.*?)</span>" & _
       "<span[^<>]*class=""title""[^<>]*>(?<destn>.*?)</span>" & _
       "<span[^<>]*class=""country""[^<>]*>(?<AtG>.*?)</span>" & _
       "<span[^<>]*class=""price""[^<>]*>(?<meVIEW>.*?)</span>")


   Dim matches As MatchCollection = span_matchsingle.Matches(Me.TextBox1.Text, RegexOptions.Singleline Or RegexOptions.IgnorePatternWhitespace)

    For Each m As Match In matches


        Dim actualD As String = m.Groups("meTIT").Value
        Dim actss As String = m.Groups("AtG").Value
        Dim actunm As String = m.Groups("destn").Value
        Dim actualzx As String = m.Groups("meVIEW").Value

        'pass them all into the listview

        Dim lvi As New ListViewItem
        lvi.Text = actualD
       lvi.SubItems.Add(actss)
        lvi.SubItems.Add(actunm)
        lvi.SubItems.Add(actualzx)
        Me.ListView1.Items.Add(lvi)

       '''''''''''''''''''''''''''''''''''''''''
        '''''''''''''''''''''''''''''''''''''''''

    Next

这是我尝试的代码,但是它没有从span中提取innertext,除非我在正则表达式中只包含一个span并且这不是我想要的。

2 个答案:

答案 0 :(得分:1)

这是Visual Basic.NET中的正则表达式模式,用于提取相同类型的第一个和最后一个HTML标记之间的所有内容。 在这种情况下,HTML标记为h2。 将图案用双引号引起来。

<h2(\s+|\w+|\d+||[\\%$#@&:,'"/\][{}=?()*]*)*>.*</h2(\s+|\w+|\d+||[\\%$#@&:,'"/\][{}=?()*]*)*>

答案 1 :(得分:0)

请理解,这里有一些人非常擅长正则表达式,但依靠正则表达式来解析HTML可能会成为一种非常令人沮丧的体验。我们中的许多人都喜欢正则表达式,并且在我们的Alphabits麦片中捕捉群组(你可以拼凑一些你为括号咬了一半的游戏),但html是一个正则表达不适合的工作。人们不会说'不要使用正则表达式&#34;为了躲避帮助,他们说这是因为使用适当的工具来完成任务正在帮助你

这就是为什么你得到#34;不要使用正则表达式来解析html&#34;。

<span[\s\S]*?>[\s\S]*?</span>

会匹配你想要的东西。

除非有嵌套范围<span><span><span></span>

<span[\s\S]*?>[\s\S]*</span>

会这样做

除非有<span></span><span></span>

等两个跨度

最后一个正则表达式不匹配,因为它将消耗整个字符串。第一个正则表达式将匹配<span><span></span>

现在可以肯定的是,您可以使用交替来覆盖各种嵌套模式,但它会变得更慢,阅读变得怪异,难以修改以及其他许多麻烦。

此外,这些没有说明> s在span标记的属性中的潜力,但这是可行的

<span(\s*\w+="[^"]*")+>...

但是你必须考虑引用样式。

<span(\s*\w+=(?:(["'])?(.*?)\2))+>

然后你必须考虑嵌套引号