pythonattrs
⑴ python自带的用于解析HTML的库HtmlParser
Python语言中内置的HtmlParser库,是一个专为HTML解析设计的工具。它的设计思路是通过继承并重载特定的方法,以便从HTML结构中提取所需的数据。
HtmlParser的核心在于其类中的属性和方法。其中,lasttag属性记录了上一个解析的标签名称,提供历史信息。主要方法包括handle_starttag,当遇到开始标签如<div>时,会调用此函数,attrs参数则传递了属性列表,通常以元组形式呈现。
要开始使用HtmlParser,你可以参考Python官方文档提供的简单示例,通过解析一个基础的HTML文档,理解各函数的作用和解析流程。在此基础上,可以尝试一些实用场景。例如:
- 创建一个静态函数,直接获取特定属性值,无需处理开始标签。
- 仅修改handle_data函数,获取所有p标签的文本内容。
- 针对具有特定class(如p_font)的p标签,通过实例属性筛选并提取文本。
- 获取p标签的属性列表,包括其所有属性。
- 提取p标签的class属性,进行进一步分析。
- 在div元素下的p标签中,提取文本内容。
- 如果数据隐藏在HTML注释中,可以创建两个继承自HTMLParser的子类,一个用于处理正常标签,另一个在handle_comment方法中解析注释中的内容。
以上案例展示了HtmlParser在实际应用中的灵活性和扩展性,可以根据需要进行定制和优化。这个库是Python开发中处理HTML数据的强大工具。
⑵ Python爬虫:HTML网页解析方法小结
要理解python是如何解析网页的,首先要理解什么是网页解析器。
简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出“我们需要的有价值的数据”或者“新的URL链接”的工具。
解析HTML:
我们知道爬虫的原理无非是把目标网址的内容下载下来存储到内存中,这个时候它的内容其实是一堆HTML,然后再对这些HTML内容进行解析,按照自己的想法提取出想要的数据。
今天主要讲讲Python中解析网页HTML内容的四种方法:
其中BeautifulSoup和XPath是python中解析网页常用的两个库,对于新手来说是利器,零基础小白建议先打好Python基础再去上手爬虫会容易一些。
“零基础如何学Python”在知乎看到过一篇比较好的问答贴,讲的很实用,大家伙可以移步去看看,链接分享在下方。
1、BeautifulSoup
大名鼎鼎的BeautifulSoup库,在Pyhton的HTML解析库里属于重量级的库。
安装途径:
解析的第一步,是构建一个BeautifulSoup对象。
第二个参数表示解析器,BeautifulSoup支持以下多种解释器:
BeautifulSoup对应一个HTML/XML文档的全部内容;
BeautifulSoup类的基本元素
任何存在于HTML语法中的标签都可以用soup.访问获得,当HTML文档中存在多个相同对应内容时,soup.返回第一个。
每个都有自己的名字,通过.name获取,字符串类型 Tag的attrs:一个可以有0或多个属性,字典类型 NavigableString可以跨越多个层次
1)访问标签
通过点号操作符,可以直接访问文档中的特定标签,示例:
这样的方式每次只会返回文档中的第一个标签,对于多个标签,则通过find_all方法返回多个标签构成的列表。
还可以在find方法中添加过滤条件,更加精确的定位元素。
2)访问标签内容和属性
通过name和string可以访问标签的名字和内容,通过get和中括号操作符则可以访问标签中的属性和值。
结合定位元素和访问属性的方法,可以方便快捷的提取对应元素,提高解析html的便利性。
使用Beautiful Soup库解析网页
BeautifulSoup解析内容同样需要将请求和解析分开,从代码清晰程度来讲还将就,不过在做复杂的解析时代码略显繁琐,总体来讲用起来还不错,看个人喜好吧。
爬虫的基本技能最重要的两点:如何抓取数据?如何解析数据?我们要活学活用,在不同的时候利用最有效的工具去完成我们的目的。
工具是其次,学习不要主末颠倒了,我上面分享的那篇文章也有提到过这个问题(链接有放在下方),要明确你学习的最终目的是什么?
2、lxml的XPath
lxml这个库同时支持HTML和XML的解析,支持XPath解析方式,解析效率挺高,不过我们需要熟悉它的一些规则语法才能使用。
使用xpath需要从lxml库中导入etree模块,还需要使用HTML类对需要匹配的HTML对象进行初始化。
安装途径:
Xpath常用表达式
使用表达式定位head和title节点
Xpath谓语常用的表达式
使用谓语定位head和ul节点
定位并获取title节点内的文本内容
提取ul节点下的所有文本文件和链接地址
XPath的解析语法稍显复杂,不过熟悉了语法的话也不失为一种优秀的解析手段。
示例:
3、requests-html
我们知道 requests 只负责网络请求,不会对响应结果进行解析,因此可以把 requests-html 理解为可以解析 HTML 文档的 requets 库。
requests-html 的代码量非常少,都是基于现有的框架进行二次封装,开发者使用时可更方便调用,它依赖于 PyQuery、requests、lxml 等库。
安装途径:
需要注意的是这个库目前只支持python3.6版本;
requests-html 具有以下特性:
requests-html默认使用session保持的请求方式,且其返回内容是一个带有丰富方法的对象。
获取一个随机User-Agent
不用每次在请求头里面去复制user-agent;
对JavaScript的支持是requests-html最大的亮点,会用到render函数,需要注意的是第一次使用这个方法,它会先下载Chromium,然后使用Chromium来执行代码,但是下载的时候可能需要一个梯子,这里就先不展开讨论了。
学过requests库的看到requests-html的api应该会很熟悉,使用方法基本一致,不同的是使用requests编写爬虫时,要先把网页爬取下来,然后再交给BeautifulSoup等一些html解析库,现在可以直接解析了。
示例:
通过简短的几行代码,就可以把整个首页的文章抓取下来。
示例中使用的几个方法:
① find( ) 可以接收两个参数:
第一个参数可以是class名称或ID第二个参数first=True时,只选取第一条数据
② text 获取元素的文本内容
③ attrs 获取元素的属性,返回值是个字典
④ html 获取元素的html内容
使用requests-html来解析内容的好处在于作者都高度封装过了,连请求返回内容的编码格式转换也自动做了,完全可以让代码逻辑更简单直接,更专注于解析工作本身。
4、正则表达式
正则表达式通常被用来检索、替换那些符合某个模式的文本,所以我们可以利用这个原理来提取我们想要的信息。
使用正则表达式, 需要导入re模块,该模块为Python提供了完整的正则表达式功能。
严格的字符匹配示例:
注意:python只支持re模块进行正则表达式的书写
使用正则表达式查找网页内容中的title内容:
使用正则表达式无法很好的定位特定节点并获取其中的链接和文本内容,而使用Xpath和Beautiful Soup能较为便利的实现这个功能。
正则就是编写麻烦,理解不容易,但是匹配效率很高,不过现在有很多现成的HTMl内容解析库之后,不太推荐再手动用正则来对内容进行匹配了,麻烦费时费力。
5、小结:
(1)正则表达式匹配不推荐,因为已经有很多现成的库可以直接用,不需要我们去大量定义正则表达式,还没法复用,尝试过正则表达式的小白就能体会,使用正则表达式来筛选网页内容是有多费劲,而且总是感觉效果不太好。
(2)BeautifulSoup是基于DOM的方式,简单的说就是会在解析时把整个网页内容加载到DOM树里,内存开销和耗时都比较高,处理海量内容时不建议使用。
BeautifulSoup不需要结构清晰的网页内容,因为它可以直接找到我们想要的标签,如果对于一些HTML结构不清晰的网页,它比较适合。
(3)XPath是基于SAX的机制来解析,不会像BeautifulSoup去加载整个内容到DOM里,而是基于事件驱动的方式来解析内容,更加轻巧。
不过XPath要求网页结构需要清晰,而且开发难度比DOM解析的方式高一点,推荐在需要解析效率时使用。
(4)requests-html 是比较新的一个库,高度封装且源码清晰,它直接整合了大量解析时繁琐复杂的操作,同时支持DOM解析和XPath解析两种方式,灵活方便,可以尝试。
除了以上介绍到几种网页内容解析方式之外还有很多解析手段,这里就暂不一一介绍了。
⑶ 【python】一文带你了解什么是dataclass
为什么需要dataclass数据类
在Python 3.7(PEP 557)后引入的@dataclass装饰器简化了数据类的创建,通过自动生成特殊方法,如__init__() 和 __repr__()等魔术方法。数据类设计用于存储数据、结构简单、用于将相关的数据组织在一起、具有清晰字段的类。使用dataclass可以更简洁、清晰地定义数据类,减少冗余代码。
比较tuple、namedtuple、dict和Typing.NamedTuple,dataclass提供了类型提示,使代码更具可读性和可维护性。虽然tuple、namedtuple和dict各有用武之地,但在更复杂的场景中,它们的灵活性和功能限制可能不足。
使用dataclass定义复杂场景的数据类时,仍然存在一些问题,如需要实现__repr__方法来自定义描述、实现__gt__方法支持比较功能。通过这些方法的实现,数据对象可以获得更直观的描述和比较支持。
数据类的使用优势包括更精确地指定每个成员变量的类型、提供字段名的检查、减少出错可能性、简洁的定义、易于阅读和理解的类型提示以及更容易发现和修复潜在错误。
dataclass在一定程度上简化了数据类的定义,但若需要精准控制程序,可能需要重载部分魔术方法。对于运动员信息存储,使用dataclass可以更精准地控制数据类。
使用field对象可以简化属性的定义,例如设置默认值、比较、hash计算等。dataclass默认阻止使用可变数据做默认值,可通过field对象实现灵活设置。
数据类可以实现去重,通过设置unsafe_hash=True和控制参与比较的字段。转换为元组或字典,使用replace方法创建新实例,其中某些字段的值被更改。
dataclass配合验证工具包如marshmallow、desert可用于数据提取或参数校验。
在许多情境下,dataclass适用于存储数据的简单对象,如配置信息、数据传输对象(DTO)、领域对象等。使用dataclass可以简化对象建模,提高代码质量。
在选择dataclass或attrs时,取决于项目需求和个人喜好。dataclasses提供基本功能,而attrs提供了更多扩展性。dataclass在数据处理和对象建模中表现优异,能提升代码清晰度和开发效率。
更多使用技巧参考官方文档。
⑷ python 类中的私有属性有哪些
类的私有属性:
__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。
在类内部的方法中使用时 self.__private_attrs。
类的方法:
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数
类的私有方法 :
__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。
在类的内部调用 self.__private_methods
实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class JustCounter:
__secretCount = 0 # 私有变量
publicCount = 0 # 公开变量
def count(self):
self.__secretCount += 1
self.publicCount += 1
print self.__secretCount
counter = JustCounter()
counter.count()
counter.count()
print counter.publicCount
print counter.__secretCount # 报错,实例不能访问私有变量
Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性,将如下代码替换以上代码的最后一行代码:
…………………….
print counter._JustCounter__secretCount
这样就可以访问私有属性了