Python⽹络爬⾍四⼤选择器(正则表达式、BS4、Xpath、
CSS)总结
前⼏天⼩编连续写了四篇关于Python选择器的⽂章,分别⽤、、、选择器分别抓取京东⽹的商品信息。今天⼩编来给⼤家总结⼀下这四个选择器,让⼤家更加深刻的理解和熟悉Python选择器。
⼀、正则表达式
正则表达式为我们提供了抓取数据的快捷⽅式。虽然该正则表达式更容易适应未来变化,但⼜存在难以构造、可读性差的问题。当在爬京东⽹的时候,正则表达式如下图所⽰:
利⽤正则表达式实现对⽬标信息的精准采集
此外,我们都知道,⽹页时常会产⽣变更,导致⽹页中会发⽣⼀些微⼩的布局变化时,此时也会使得之前写好的正则表达式⽆法满⾜需求,⽽且还不太好调试。当需要匹配的内容有很多的时候,使⽤正则表达式提取⽬标信息会导致程序运⾏的速度减慢,需要消耗更多内存。
⼆、BeautifulSoup
BeautifulSoup是⼀个⾮常流⾏的 Pyhon 模块。该模块可以解析⽹页,并提供定位内容的便捷接⼝。通过'pip install beautifulsoup4'就可以实现该模块的安装了。
利⽤美丽的汤去提取⽬标信息
使⽤ BeautifulSoup的第⼀步是将⼰下载的 HTML 内容解析为 soup⽂档。由于⼤多数⽹页都不具备良好的HTML 格式,因此BeautifulSoup需要对实际格式进⾏确定。BeautifulSoup能够正确解析缺失的引号并闭合标签,此外还会添加<html >和<body>标签使其成为完整的HTML⽂档。通常使⽤find() 和find_all()⽅法来定位我们需要的元素。如果你想了解BeautifulSoup全部⽅法和参数,可以查阅BeautifulSoup的官⽅⽂档。虽然BeautifulSoup在代码的理解上⽐正则表达式要复杂⼀些,但是其更加容易构造和理解。
三、Lxml
Lxml模块使⽤ C语⾔编写,其解析速度⽐ BeautiflSoup更快,⽽且其安装过程也更为复杂,在此⼩编就不赘述啦。XPath 使⽤路径表达式在XML ⽂档中选取节点。节点是通过沿着路径或者 step 来选取的。
Xpath
使⽤ lxml 模块的第⼀步和BeautifulSoup⼀样,也是将有可能不合法的HTML 解析为统⼀格式。虽然Lxml可以正确解析属性两侧缺失的引号,并闭合标签,不过该模块没有额外添加<html >和<body>标签。
在线复制Xpath表达式可以很⽅便的复制Xpath表达式。但是通过该⽅法得到的Xpath表达式放在程序中⼀般不能⽤,⽽且长的没法看。所以Xpath表达式⼀般还是要⾃⼰亲⾃上⼿。
四、CSS
CSS选择器表⽰选择元素所使⽤的模式。BeautifulSoup整合了CSS选择器的语法和⾃⾝⽅便使⽤API。在⽹络爬⾍的开发过程中,对于熟悉CSS选择器语法的⼈,使⽤CSS选择器是个⾮常⽅便的⽅法。
CSS选择器
下⾯是⼀些常⽤的选择器⽰例。
选择所有标签:*
选择<a>标签: a
选择所有class=”link” 的元素: .l in k
选择 class=”link” 的<a>标签: a.link
选择 id= " home ” 的<a>标签: a Jhome
选择⽗元素为<a>标签的所有< span>⼦标签: a > span
选择<a>标签内部的所有<span>标签: a span
选择title属性为” Home ” 的所有<a>标签: a [title=Home]
五、性能对⽐
python正则表达式判断
lxml 和正则表达式模块都是C语⾔编写的,⽽BeautifulSoup则是纯Python 编写的。下表总结了每种抓取⽅法的优缺点。
相对困难需要注意的是。lxml在内部实现中,实际上是将CSS选择器转换为等价的Xpath选择器。
六、总结
如果你的爬⾍瓶颈是下载⽹页,⽽不是抽取数据的话,那么使⽤较慢的⽅法(如BeautifulSoup)也不成问题。如果只需抓取少量数据,并且想要避免额外依赖的话,那么正则表达式可能更加适合。不过,通常情况下,l xml是抓取数据的最好选择,这是因为该⽅法既快速⼜健壮,⽽正则表达式和BeautifulSoup只在某些特定场景下有⽤。
想学习更多Python⽹络爬⾍与数据挖掘知识,可前往专业⽹站: