第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何匹配 `<a>` 標(biāo)記之前的文本然后返回 `<a>` 節(jié)點(diǎn)?

如何匹配 `<a>` 標(biāo)記之前的文本然后返回 `<a>` 節(jié)點(diǎn)?

Go
森林海 2022-04-26 10:50:46
我有以下內(nèi)容,我試圖僅捕獲文本匹配的第二種情況But I want this one here。目前,它涵蓋了這兩種情況。package mainimport (    "bytes"    "fmt"    "io"    "strings"    "golang.org/x/net/html")func getTag(doc *html.Node, tag string) []*html.Node {    var nodes []*html.Node    var crawler func(*html.Node)    crawler = func(node *html.Node) {        if node.Type == html.ElementNode && node.Data == tag {            nodes = append(nodes, node)            return        }        for child := node.FirstChild; child != nil; child = child.NextSibling {            crawler(child)        }    }    crawler(doc)    return nodes}func main() {    doc, _ := html.Parse(strings.NewReader(testHTML))    nodes := getTag(doc, "a")    var buf bytes.Buffer    w := io.Writer(&buf)    for i, node := range nodes {        html.Render(w, node)        if i < (len(nodes) - 1) {            w.Write([]byte("\n"))        }    }    fmt.Println(buf.String())}var testHTML = `<html><body>I do not want this link here <a href="blah">link text</a>But I want this one here <a href="blah blah">more link text</a></body></html>`這輸出:<a href="blah">link text</a><a href="blah blah">more link text</a>我想匹配<a>標(biāo)簽之前的特定文本,如果匹配,則返回<a>節(jié)點(diǎn)。例如,傳入But I want this one here并返回<a href="blah blah">more link text</a>. 有人告訴我不要用正則表達(dá)式解析 html,但現(xiàn)在我被卡住了。
查看完整描述

1 回答

?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

您實(shí)際上非常接近,因?yàn)槟呀?jīng)在使用正確的解析器(html.Parsefrom golang.org/x/net/html)。


這里的訣竅是頁(yè)面的各種元素很方便地綁定在一起,所以crawler如果你愿意,你可以使用你現(xiàn)有的代碼和以后的過(guò)濾功能。(您可以改為將過(guò)濾直接組合到爬蟲(chóng)中。)


每個(gè)n *html.ElementNode前面都有一些東西,除非它是塊中的初始元素(文檔的第一個(gè)元素或第一個(gè)子節(jié)點(diǎn)),并且某個(gè)東西在n.PrevSibling. 如果它的類型是html.TextNode你有一個(gè)形式的序列:


some text<a ...>thing</a>

您可以檢查上一個(gè)節(jié)點(diǎn)中的“一些文本”:


func wanted(re *regexp.Regexp, n *html.Node) bool {

    if n.PrevSibling == nil || n.PrevSibling.Type != html.TextNode {

        return false

    }

    return re.MatchString(n.PrevSibling.Data)

}

這并不完美,因?yàn)槟梢該碛校纾?/p>


text <font></font> broken <font></font>up<a href="lastlink">last link</a>

并且代碼將嘗試匹配 string up,當(dāng)您可能應(yīng)該將文本放在一起text broken up并將其傳遞給匹配器時(shí)。在此處查看更完整的示例。


查看完整回答
反對(duì) 回復(fù) 2022-04-26
  • 1 回答
  • 0 關(guān)注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)