我有一个关于使用正则表达式从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并且这不是我想要的。
答案 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))+>
然后你必须考虑嵌套引号