簡體   English   中英

使用正則表達式從 html 中提取 [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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM