Python爬虫教程第5篇-使用BeautifulSoup查找html元素几种常用方法

文章目录

简介

上一篇详细的介绍了如何使用Beautiful Soup的使用方法,但是最常用的还是如何解析html元素,这里再汇总介绍下查询html元素的一些方式,比如通过id查找、通过xpath查找、通过css查找等方式的最佳实践。

find()和find_all()

这两个方法参数差不多,区别在于find返回一个,find_all可能返回多个,find底层调用的也是find_all只是设置里limit=1。所以下面讲到的一些用法不区分是find还是find_all

字符串

python 复制代码
soup.find_all('b')

查找所有标签是b的tag

通过id查找

keyword: key=value的形式,value可以是过滤器:字符串 , 正则表达式 , 列表, True .

python 复制代码
soup.find(id='xxxx')
soup.find(id=re.compile('my'))

id是标签的属性,一般用于唯一元素定位

通过属性查找

上面id其实也是tag的一个属性,所以展开就是taq的属性可以类似查找.比如:

python 复制代码
soup.find(class='xxxx')

通过.方式查找

这种比较直观,有点像链式调用,其实能直接看出html的层级结构

python 复制代码
soup.head.title

通过CSS选择器查找

css路径可以通过下图这种方式在页面上快速定位:

#s_xmancard_news_new > div > div.s-news-rank-wrapper.s-news-special-rank-wrapper.c-container-r > div > div > ul

python 复制代码
soup.select('#s_xmancard_news_new > div > div.s-news-rank-wrapper.s-news-special-rank-wrapper.c-container-r > div > div > ul')

通过xpath查找

xpath全称为XML Path Language, 一种小型的查询语言,实现的功能与re以及bs一样,但是大多数情况会选择使用xpath。由于XPath属于lxml库模块,所以首先要安装库lxml。xpath路径查找:

//*[@id="s_xmancard_news_new"]/div/div[1]/div/div/ul

python 复制代码
from lxml import etree

selector=etree.HTML('')   # 将源码转化为能被XPath匹配的格式
# <Element html at 0x29b7fdb6708>
ret = selector.xpath('//*[@id="s_xmancard_news_new"]/div/div[1]/div/div/ul')     # 返回为一列表

正则表达

python 复制代码
# name: 搜索name参数的值可以使任一类型的 过滤器 ,字符窜,正则表达式,列表,方法或是 True .
soup.find_all(name=re.compile('^t'))

自定义方法

python 复制代码
# 如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数 ,如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是则反回 False
def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
 
soup.find_all(has_class_but_no_id)    

或者使用匿名函数

python 复制代码
soup.find_all(lambda tag: True if tag.has_attr("class") and tag.has_attr("id") else False)

总结

更多使用方法参考官网:https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/#id7

相关推荐
我送炭你添花8 分钟前
Pelco KBD300A 模拟器:06+2.Pelco KBD300A 模拟器项目重构指南
python·重构·自动化·运维开发
Swizard10 分钟前
别再只会算直线距离了!用“马氏距离”揪出那个伪装的数据“卧底”
python·算法·ai
站大爷IP11 分钟前
Python函数与模块化编程:局部变量与全局变量的深度解析
python
我命由我1234520 分钟前
Python Flask 开发问题:ImportError: cannot import name ‘Markup‘ from ‘flask‘
开发语言·后端·python·学习·flask·学习方法·python3.11
databook28 分钟前
掌握相关性分析:读懂数据间的“悄悄话”
python·数据挖掘·数据分析
全栈陈序员1 小时前
【Python】基础语法入门(二十)——项目实战:从零构建命令行 To-Do List 应用
开发语言·人工智能·python·学习
jcsx1 小时前
如何将django项目发布为https
python·https·django
苏打水com1 小时前
第十九篇:Day55-57 前端工程化进阶——从“手动低效”到“工程化高效”(对标职场“规模化”需求)
前端·css·vue·html
岁月宁静1 小时前
LangGraph 技术详解:基于图结构的 AI 工作流与多智能体编排框架
前端·python·langchain
百锦再1 小时前
京东云鼎入驻方案解读——通往协同的“高架桥”与“快速路”
android·java·python·rust·django·restful·京东云