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 关注
- 142 浏览
添加回答
举报