2020-11-27 爬虫第二步, 分析HTML代码,仅供学习回顾

本文介绍了使用正则表达式、XPATH及BeautifulSoup等工具进行HTML代码分析的方法。重点讲解了XPATH语法及其节点选择器的运用,并对比了几种不同解析器的特点。

分析HTML代码,作者目前喜欢利用正则表达式和XPATH
常用的工具

  1. 正则表达式
  2. XPATH
  3. beautiful soup

正则表达式

十分强大的工具, 一定要学会的东西
推荐一个练习正则表达式的网站
练习网站

XPATH


首先你需要安装 lxml 包
lxml库是一种专门分析xml文件的包

from lxml import etree
tree = etree.parse("t.xml")

相关操作

tree.getroot()
root.tag
root.getchildren()
# 返回的数据类型都是N维列表,你可以用索引访问的
root.get('id') # 获得属性
root.text # 获得文本内容

操作HTML

# 从文件
from lxml import etree
tree = etree.parse("t.html", etree.HTMLParser())
# 从代码
tree = etree.HTML(ele)

Xpath有其专门的语法,(懂操作系统的文件路径嘛??懂?那XPATH语法对你来说就简单不少了)

语法规则作用
nodename选取此节点的所有子节点
/从此节点选取直接子节点
//从此节点选取子孙节点
.当前节点
. .父节点
@选取属性

(直接进行有关属性操作的举例)

html.xpath('//a[@href=""]')
# 选取每个a节点,要求a节点的href=""
html.xpath('//a[contains(@href, "www")]/@href')
# 选取每个a节点,要求a节点的href属性包含www, 并获取其href

多属性匹配(and or)

html.xpath('//a[@href = "" and @href = ""]')
html.xpath('//a[contains(@href, "www") or ../@value="1234"]')

按序查找

html.xpath('//a[1]/@href')
# 获取第一个a节点的href
html.xpath('//a[position() = 2]/text()')
# 获取第二个a节点的文本

对了,xpath返回的也是n维列表,列表的操作都懂的
节点选择器
Xpath也有相应的选择器来更精准的选择节点

轴名称作用
ancestor选择当前节点的所有先辈
ancestor-or-self选择当前节点的所有先辈以及自己
attribute选择当前节点的所有属性
parent选择当前节点的父节点
child选择当前节点的所有子节点
descendant选择当前节点的所有子孙节点
descendant-or-self选择当前节点的所有子孙节点以及自己
following选取文档中当前节点的结束标签之后的所有节点
following-sibling选取当前节点之后的所有兄弟节点(选择兄弟节点)
preceding选取当前节点开始标签之前的所有节点
preceding-sibling选择当前节点之前的所有兄弟节点
self选取自己
namespace选取当前节点的命名空间的节点(我也不会用)

提示:Chrome可以自动获取xpath路径(所以你几乎不用自己写)

Beautiful Soup

  1. 解析器
解析器写法功能
Python自带解析器BeattifulSoup(html, ‘html.parser’)python自带,速度适中,容错能力强
lxml HTML解析器BeautifulSoup(html, ‘lxml’)速度快,容错能力强,需要C语言支持
lxml XML 解析器BeautifulSoup(html, ‘xml’)速度快,支持xml,需要C语言支持
html5lib解析器BeautifulSoup(html, ‘html5lib’)最好的容错性,已浏览器的方式解析文档,生成Html5格式的文档,速度慢
  1. 节点选择器
    2.1 节点选择
soup.li.name # 第一个li节点的名字
soup.li.attrs # 第一个li节点的属性 -> dict
soup.li.attrs['class'] # 第一个li节点的class属性
soup.li.string # 第一个li节点的内容
2.2 嵌套节点选择
soup.body.div.ul.li.a.string
2.3 子节点选择
soup.body.div.children # 子节点地址 需要自己for手动遍历
soup.body.div.contents # 子节点列表
soup.body.div.descendants # 子孙节点 需要自己for遍历
2.4 父节点选择
soup.body.div.parent # 父节点
soup.body.div.parent['class'] # 
  1. 方法选择器
    3.1 find_all
    函数参数:name, attrs,text
    其中name用于指定节点名称,
soup.find_all(name='ul') # --> list
attrs用于表示节点属性 attrs={‘id’:'button'}
soup.find_all(attrs={'id':'button'})
text匹配文本节点,可以是正则表达式
soup.find_all(text='geekori.com');
soup.find_all(text=re.compile('hello'))
3.2 find
与find_all类似,但是find只返回所查找到的第一个结果
  1. CSS选择器
    如果你学习过CSS,这个东西你已经会了
    常用css选择器
名称功能
.classname选取class属性为classname的节点
nodename选取节点为nodename的节点
#idname选取id为idname的节点
soup.select('.item') # --> list
soup.select('#button1')
soup.select('li')

提示:Chrome可以自动获取CSS路径

<think>首先,用户查询是关于分析包含Flask框架的Python代码所用的技术以及代码中各部分的功能。用户没有提供具体的代码,所以我需要回想之前的上下文或基于一般知识回答。用户提到“参考站内引用”,但引用[1]和[2]是关于Flask框架的介绍和电影数据可视化项目的技术栈。用户说“上述引用仅供参考”,所以我应该专注于用户的当前问题:分析代码的技术和功能。 回顾用户的指令:"我想分析给定代码所用的技术与每个部分的功能",但用户没有给出代码。在对话历史中,用户上一次的问题似乎是关于站内引用,但之前的系统指令是关于生成相关问题和回答格式。用户现在的查询是“分析包含Flask框架的Python代码所用的技术以及代码中各部分的功能”,但没有提供具体代码。 在系统级指令中,它说:“请尽可能多的参考用户上一次的问题和你的回答。”回顾之前的对话: - 第一条消息是系统级指令。 - 第二条消息是用户查询:"参考站内引用:引用[1]:...引用[2]:...我想分析给定代码所用的技术与每个部分的功能" 用户说“给定代码”,但没有给出代码。在引用中,有提到Flask框架,但没有实际代码。用户可能期望我基于一般Flask代码分析。 用户还说:“上述引用仅供参考”,所以我不能直接复制引用,而是基于知识回答。 我的回应应该: 1. 使用中文回答。 2. 结构清晰,帮助用户逐步解决问题。 3. 保证回答真实可靠。 4. 对于数学表达式,使用$...$或$$...$$格式,但在这个上下文中,可能不涉及数学,所以可能不需要。 5. 生成相关问题(作为最后部分)。 主题是分析Flask框架的Python代码的技术和功能。既然没有具体代码,我应该提供一个通用的分析,解释Flask应用的基本结构和常用技术。 回忆Flask应用的典型组成部分: - 导入Flask模块:`from flask import Flask, render_template, request, etc.` - 创建Flask应用实例:`app = Flask(__name__)` - 定义路由和视图函数:使用`@app.route`装饰器指定URL路径。 - 视图函数处理请求:返回响应,如HTML页面或数据。 - 模板渲染:使用Jinja2模板。 - 数据库集成:如SQLAlchemy或直接MySQL。 - 其他扩展:如Flask-WTF for forms, Flask-Login for authentication. 从引用[2]中,提到了技术栈:Python, Flask, pyecharts, requests, MySQL。所以在分析中,我可以提到这些作为常见技术。 回应结构: 1. **介绍Flask框架**:基于引用,解释Flask是什么。 2. **分析技术**:列出常用技术:Flask核心、扩展(如数据库、可视化库)。 3. **代码各部分功能**:描述一个基本Flask应用的代码结构: - 初始化和配置 - 路由定义 - 视图函数 - 模板使用 - 数据库连接 - 错误处理 4. **以示例代码说明**:既然用户提到“给定代码”,但没有提供,我可以提供一个简单的Flask代码示例,并分析它。系统指令要求生成相关问题,所以最后添加相关问题。 在系统级指令的示例中,有Python代码块,所以我可以包含一个代码块。 确保LaTeX格式正确,但如果没有数学,可能不需要。 最后,添加相关问题。 回应大纲: - 开头:解释我将分析一个典型Flask应用。 - 技术部分:列出Flask及其扩展的技术。 - 功能部分:分解代码各部分功能,使用一个代码示例。 - 代码示例:写一个简单的Flask app代码,并注释功能。 - 结尾:生成相关问题。 从引用中,自然地添加引用标识,例如[^1],但用户说“参考站内引用”,所以我应该引用[^1]和[^2]作为来源。 用户说:“上述引用仅供参考”,所以适度引用。 具体回应: 1. 介绍:Flask是一个微框架,用于构建Web应用。参考引用[^1]。 2. 技术:核心Flask、扩展如pyecharts for 可视化、requests for 爬虫、MySQL for 数据库存储。 3. 代码分析:使用一个示例代码。 示例代码: ```python from flask import Flask, render_template app = Flask(__name__) @app.route('/') def home(): return render_template('index.html') @app.route('/about') def about(): return "About Page" if __name__ == '__main__': app.run(debug=True) ``` 分析各部分: - 导入:导入Flask模块。 - app实例:创建应用对象。 - 路由:使用装饰器定义URL。 - 视图函数:处理请求,返回响应。 - 运行:启动服务器。 4. 相关问题:生成3个问题。 确保回答真实可靠:基于一般知识。 </think>### Flask框架Python代码技术与功能分析 根据您的查询,我将分析一个典型包含Flask框架的Python Web应用的代码结构和技术栈。Flask是一个轻量级微框架,核心功能简洁,但可通过扩展增强(如数据库、可视化等)[^1]。在数据分析项目中(如豆瓣电影可视化),常用技术包括Flask、pyecharts、requests爬虫库和MySQL数据库[^2]。由于您未提供具体代码,我将基于一个通用示例(模拟电影数据展示应用)进行分析代码将包含核心Flask功能和常见扩展,以确保真实可靠。 #### 1. **技术栈分析** 在Flask应用中,代码通常依赖于以下技术组件: - **Flask核心**: 提供Web应用基础(如路由、请求处理)。 - **扩展库**: - **requests**: 用于发送HTTP请求,爬取外部数据(如电影信息)。 - **pyecharts**: 用于数据可视化(如生成图表)。 - **MySQL**: 通过Flask-SQLAlchemy扩展实现数据库存储。 - **Jinja2模板引擎**: 内置于Flask,用于渲染HTML页面。 - **其他工具**: Python标准库(如json用于数据处理)、Flask-WTF(表单处理)等。 这些技术组合使Flask应用易于扩展,例如在电影分析系统中实现数据爬取、存储和可视化[^2]。 #### 2. **代码各部分功能分析** 下面是一个简化Flask应用代码示例(模拟电影数据展示)。代码分为初始化、路由定义、数据处理和运行部分,我将逐段解释功能。 ```python # 导入必要模块(技术核心) from flask import Flask, render_template, request import requests # 爬虫库,用于获取外部数据 from pyecharts.charts import Bar # 可视化库,用于生成图表 from flask_sqlalchemy import SQLAlchemy # 数据库扩展 # 初始化Flask应用和数据库 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:password@localhost/movie_db' # 配置MySQL数据库连接 db = SQLAlchemy(app) # 创建数据库对象 # 定义数据模型(数据库表) class Movie(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) rating = db.Column(db.Float, nullable=False) # 首页路由:展示电影数据 @app.route('/') def home(): # 使用requests爬取豆瓣电影数据(示例URL) response = requests.get('https://api.douban.com/v2/movie/top250') movies_data = response.json()['subjects'][:10] # 提取前10部电影 # 存储数据到MySQL数据库 for movie in movies_data: new_movie = Movie(title=movie['title'], rating=movie['rating']['average']) db.session.add(new_movie) db.session.commit() # 查询数据库获取电影数据 movies = Movie.query.all() # 使用pyecharts生成柱状图可视化 bar_chart = Bar() bar_chart.add_xaxis([movie.title for movie in movies]) bar_chart.add_yaxis("评分", [movie.rating for movie in movies]) chart_html = bar_chart.render_embed() # 渲染为HTML字符串 # 渲染模板并传递数据(Jinja2引擎) return render_template('index.html', movies=movies, chart_html=chart_html) # 运行服务器 if __name__ == '__main__': db.create_all() # 创建数据库表(首次运行) app.run(debug=True) # 启动Flask开发服务器 ``` **代码各部分功能详细解释**: - **导入模块部分**: - `from flask import ...`: 导入Flask核心功能(如路由、渲染模板)。 - `import requests`: 集成爬虫库,用于从外部API(如豆瓣)获取数据[^2]。 - `from pyecharts.charts import Bar`: 使用pyecharts实现数据可视化(生成柱状图)。 - `from flask_sqlalchemy import SQLAlchemy`: 通过Flask-SQLAlchemy扩展连接MySQL数据库,简化数据库操作。 - **初始化应用与数据库**: - `app = Flask(__name__)`: 创建Flask应用实例。 - `app.config[...]`: 配置数据库URI(指向MySQL),存储电影数据。 - `db = SQLAlchemy(app)`: 初始化数据库对象,用于模型定义和查询。 - **数据模型定义**: - `class Movie(db.Model)`: 定义MySQL表结构(ORM模型),每个电影有ID、标题和评分字段。这支持高效数据存储和检索。 - **路由和视图函数**: - `@app.route('/')`: 装饰器定义URL路由(首页)。 - `def home()`: 视图函数处理请求: - **爬取数据**: 使用`requests.get`获取豆瓣电影API数据。 - **数据库操作**: 存储爬取数据到MySQL(`db.session.add`和`commit`),然后查询所有电影。 - **可视化**: 用pyecharts创建柱状图,展示电影评分。 - **模板渲染**: 通过`render_template`调用Jinja2模板(`index.html`),传递电影数据和图表HTML- **服务器运行**: - `if __name__ == '__main__':`: 确保脚本直接运行时执行。 - `db.create_all()`: 初始化数据库表(仅第一次)。 - `app.run(debug=True)`: 启动开发服务器(debug模式便于测试)。 #### 3. **关键技术与优势** - **Flask轻量性**: 核心代码简洁(少于50行),但通过扩展(requests、pyecharts、SQLAlchemy)实现全功能Web应用[^1]。 - **扩展优势**: - requests用于实时数据更新(爬虫),pyecharts提供交互式可视化,MySQL支持结构化存储。 - 在电影分析项目中,这实现了从数据获取到展示的完整流程[^2]。 - **性能考虑**: 对于大规模数据,可添加缓存(如Flask-Caching)或异步处理(如Celery)。 这个分析基于通用Flask应用模式,如需针对特定代码深入分析,请提供代码片段。 ### 相关问题 1. 如何在Flask应用中优化数据库查询性能? 2. Flask框架与Django框架相比有哪些优缺点? 3. 如何处理Flask中的数据爬取错误(如API请求失败)?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值