亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何匹配 `<a>` 標記之前的文本然后返回 `<a>` 節點?

如何匹配 `<a>` 標記之前的文本然后返回 `<a>` 節點?

Go
森林海 2022-04-26 10:50:46
我有以下內容,我試圖僅捕獲文本匹配的第二種情況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>標簽之前的特定文本,如果匹配,則返回<a>節點。例如,傳入But I want this one here并返回<a href="blah blah">more link text</a>. 有人告訴我不要用正則表達式解析 html,但現在我被卡住了。
查看完整描述

1 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

您實際上非常接近,因為您已經在使用正確的解析器(html.Parsefrom golang.org/x/net/html)。


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


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


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

您可以檢查上一個節點中的“一些文本”:


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)

}

這并不完美,因為您可以擁有,例如:


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

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


查看完整回答
反對 回復 2022-04-26
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號