![](/img/trans.png)
[英]Is there a better way to extract HTML code using Visual Basic
[英]Extract from html using regex [visual basic]
我有一個關於使用正則表達式從 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 中提取內部文本,除非我在正則表達式中只包含一個 span 而這不是我想要的。
這是 Visual Basic.NET 中的正則表達式模式,用於提取相同類型的第一個和最后一個 HTML 標記之間的所有內容。 在這種情況下,HTML 標記是 h2。 用雙引號將模式括起來。
<h2(\s+|\w+|\d+||[\\%$#@&:,'"/\][{}=?()*]*)*>.*</h2(\s+|\w+|\d+||[\\%$#@&:,'"/\][{}=?()*]*)*>
請理解,這里有些人非常擅長正則表達式,但是依靠正則表達式來解析 html 會成為一種非常令人沮喪的體驗。 我們中的許多人都喜歡正則表達式,並在我們的 Alphabits 麥片中創建捕獲組(您可以將一些已經咬成兩半的圓括號拼接起來),但是 html 是正則表達式不適合的一項工作。 人們不會說“不要使用正則表達式”來逃避幫助,他們這么說是因為使用合適的工具來完成任務是在幫助你。
這就是您收到“不要使用正則表達式解析 html”的響應的原因。
<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))+>
然后你還必須考慮嵌套引號
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.