BeautifulSoup4的基本用法以及CSS选择器

BeautifulSoup4的基本用法以及CSS选择器
from bs4 import BeautifulSoup

'''
BeautifulSoup中文官方文档地址: https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

BeautifulSoup4是爬虫必学的技能。BeautifulSoup最主要的功能是从网页抓取数据,
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,
如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。
BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
    1.Tag: Tag通俗点讲就是HTML中的一个个标签
    2.NavigableString: 已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可
    3.BeautifulSoup: BeautifulSoup对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性
    4.Comment: Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号
'''

# 打开百度首页的html源码
file = open('./html_doc.html', 'r', encoding='utf-8')
html_doc = file.read()

# 实例化创建一个bs4对象,指定使用lxml解析器进行解析
soup = BeautifulSoup(html_doc, 'lxml')

# 通过Tag标签获取文档数据
# print(soup.prettify())  # 格式化html结构
# print(soup.title)  # 获取title标签的名称
# print(soup.title.name)  # 获取title标签的name
# print(soup.title.string)  # 获取title标签内的文本
# print(soup.title.text)  # 同上
# print(soup.head)  # 获取head标签的所有内容
# print(soup.div)   # 获取第一个div标签中的所有内容
# print(soup.div["id"])  # 获取第一个div标签的id的值
# print(soup.a)  # 获取第一个a标签中的所有内容
# print(soup.a.next_sibling.next_sibling)  # 获取第二个a标签中的所有内容
# print(soup.a['class'])  # 获取第一个a标签中的class属性的值

# 通过搜索获取页面中的标签
# print(soup.find_all("a"))  # 获取所有的a标签
# print(soup.find(id="news"))  # 获取id="news"的所有内容
# for item in soup.find_all("a"):
#     print(item.get("href"))  # 获取所有的a标签,并遍历打印a标签中的href的值
# for item in soup.find_all("a"):
#     print(item.get_text())  # 获取所有的a标签,并遍历打印a标签中的文本
#     # print(item.text)

# 对于 Tag,它有两个重要的属性,是 name 和 attrs
# print(soup.title.name)  # 获取title标签的name
# print(soup.a.attrs)  # 将第一个a 标签的所有属性打印输出了出来,得到的类型是一个字典
# print(soup.a.next_sibling.next_sibling.attrs)  # 将第二个a 标签的所有属性打印输出了出来,得到的类型是一个字典

# print(soup.a["class"])  # 获取第一个a标签中的class属性的值
# soup.a["class"] = "newClass"   # 对这些属性和内容等等进行修改
# print(soup.a)

# 还可以对这个属性进行删除
# del soup.a['class']  # 删除a标签的class属性
# print(soup.find_all('a'))

# 通过NavigableString获取标签内部的文字
# print(soup.title.string)
# print(soup.a.string)

# Css选择器
# BeautifulSoup支持发部分的CSS选择器,在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag
#
# 通过标签名查找
# print(soup.select('title'))
# print(soup.select('a'))
#
# 通过类名(class属性)查找,在类的前面加一个点“.”
# print(soup.select('.mnav'))
#
# 通过id查找,在id名字前加 “#”
# print(soup.select('#news'))
# print(soup.select('#u1'))
#
# 通过组合查找,通过标签名和类名、id名进行组合,要用空格分开
# print(soup.select('div .bri'))
#
# 通过属性查找,属性需要用中括号括起来
# 属性和标签属于同一节点,所有中间不能加空格,否则无法匹配到
# print(soup.select('a[class="bri"]'))
# print(soup.select('a[href="http://tieba.baidu.com"]'))
#
# 通过直接子标签查找,用>分割
# print(soup.select('body > div'))
#
# 通过兄弟节点标签查找,用 ~ 分隔
# print(soup.select('.mnav ~ .bri'))
#
# 获取内容
# title = soup.select('title')
# print(soup.select('title')[0].get_text())

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk