本题来自读者交流群。原问题如下图所示:这个问题在一般爬虫的开发中确实会涉及到。然而,由于网页的HTML结构千变万化,通用的爬虫需要在事先不知道目标网页的结构的情况下提取内容。在这种情况下,通用爬虫一般分为几个不同的部分,如下图所示:其中,HTML源代码重写组件会按照一定的策略修改网页的源代码,剔除不相关的节点,并合并复杂但没有必要的嵌套节点...重写后输出一个比较标准统一的HTML传递给下游的信息抽取组件进行内容抽取。同学的问题涉及重写源代码。其实使用lxml在DOM树中插入一个节点应该是完全没有问题的。会谷歌的同学,只要搜索lxmlhtmlinsertelement,自然会找到很多解法,如下图所示:不过这个问题比较奇怪的是,需要在元素的前面加上子节点文本节点。Drylectures可能不好描述,所以我用一个例子来说明这个问题。我们先来看这段代码:fromlxml.htmlimportfromstring,Element,etreefromhtmlimportunescapehtml='''
Hello
QingnanHello
的区别?这不是作弊吗?我知道你不服气,但这是真实的情况。这就是一般的爬虫在重写HTML源代码时所做的事情。因为直接重写网页的Dom树是很麻烦的。如果直接修改Dom树,往往需要找到一个节点的父节点,然后再找到父节点的兄弟节点的子节点进行修改。或者判断一个节点是否有子节点,yesorno,需要两种逻辑来防止对Dom树的破坏。因此,我们一般不会直接修改Dom树,而是使用构建器在扫描原有Dom树的同时,重建一棵新的Dom树。重建Dom树的过程比修改Dom树要简单的多。毕竟,写过代码的人都知道,写新代码要比改别人的代码容易得多。参考资料[1]lxml.html.builder:https://lxml.de/api/lxml.html.builder-module.html本文转载自微信公众号“听不见的代码”,可通过以下二维码关注代码。转载本文请联系Code公众号。