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并將其傳遞給匹配器時。在此處查看更完整的示例。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報