Python网络爬虫技术---第三讲

本文介绍了HTML的基本结构和标签,重点讲解了Python库lxml用于解析和操作XML/HTML元素的方法,包括获取和设置属性、XPath选择器,以及使用BeautifulSoup和正则表达式。同时讨论了json库的dumps和loads方法,用于JSON数据的序列化和反序列化。
摘要由CSDN通过智能技术生成

HTML(Hypertext Markup Language)

是一种用于创建网页的标记语言。在HTML中,标签是用来定义和组织网页内容的元素。


HTML标签及其用途


<html>:定义HTML文档的根元素。
<head>:定义HTML文档的头部,包含了一些元数据和链接到外部资源的标签。
<title>:定义HTML文档的标题,显示在浏览器的标题栏或标签页上。
<body>:定义HTML文档的主体部分,包含了网页的实际内容。
<h1> - <h6>:定义标题,从大到小分为六个级别。
<p>:定义段落。
<a>:定义超链接,用于链接到其他网页或文档。
<img>:定义图像,用于在网页中显示图片。
- <ul>:定义无序列表。
- <ol>:定义有序列表。
<li>:定义列表项。
<table>:定义表格。
<tr>:定义表格的行。
- <td>:定义表格的单元格。
<div>:定义文档中的一个区块或容器。
<span>:定义文档中的一个行内元素。
- <form>:定义表单,用于用户输入和提交数据。
<input>:定义表单中的输入字段。
<button>:定义按钮。
<select>:定义下拉列表。
<option>:定义下拉列表中的选项。


lxml

lxml是一个Python库,用于解析和处理XML和HTML文档。它提供了一种简洁而强大的语法来访问和操作文档中的元素和属性。

获取元素的属性值

element.get('attribute_name')

这个语法用于获取指定元素的属性值。element是要获取属性值的元素对象,attribute_name是要获取的属性名称

设置元素的属性值

 element.set('attribute_name', 'attribute_value')

这个语法用于设置指定元素的属性值。element是要设置属性值的元素对象,attribute_name是要设置的属性名称,attribute_value是要设置的属性值。

检查元素是否具有某个属性

'attribute_name' in element.attrib

这个语法用于检查指定元素是否具有某个属性。element.attrib是一个字典,包含了元素的所有属性,通过判断属性名称是否在字典中来确定元素是否具有该属性。

删除元素的属性

 del element.attrib['attribute_name']

这个语法用于删除指定元素的属性。element.attrib是一个字典,通过删除字典中的属性来删除元素的属性。


Xpath

在lxml中,要选取具有特定属性的元素,可以使用XPath语法

XPath是一种用于在XML和HTML文档中定位元素的语言。它提供了一种灵活而强大的方式来选择元素,包括根据元素的属性进行选择。

语法中用@语法实现选取属性

选取具有指定属性的元素

  element.xpath("//element_name[@attribute_name='attribute_value']")

这个语法用于选取具有指定属性的元素。element_name是要选取的元素名称,attribute_name是要匹配的属性名称,attribute_value是要匹配的属性值。

选取具有包含指定属性的元素

element.xpath("//element_name[contains(@attribute_name, 'attribute_value')]")

这个语法用于选取具有包含指定属性的元素。element_name是要选取的元素名称,attribute_name是要匹配的属性名称,attribute_value是要匹配的属性值的一部分。

选取具有任意属性的元素

element.xpath("//element_name[@*]")

这个语法用于选取具有任意属性的元素。element_name是要选取的元素名称。

contains(), and,text()

contains():contains()函数用于选择具有包含指定字符串的属性值或文本内容的元素。它接受两个参数:属性名称或 text() 关键字,以及要匹配的字符串。

例如:contains(@attribute_name, 'attribute_value') 用于选择具有包含指定属性值的元素,contains(text(), 'text_value') 用于选择具有包含指定文本内容的元素。

and:and 关键字用于在XPath表达式中组合多个条件。它用于同时满足多个条件的情况。

例如://element_name[@attribute1='value1' and @attribute2='value2'] 用于选择具有同时满足 attribute1 和 attribute2 条件的元素。

text():text() 关键字用于选择元素的文本内容,用于选择具有指定文本内容的节点。它可以用作XPath表达式的一部分,用于选择具有特定文本内容的元素。

例如://element_name[text()='text_value'] 用于选择具有指定文本内容的元素。


Tag

在lxml库中,Tag对象表示XML或HTML文档中的一个元素。Tag对象具有许多属性,用于访问和操作元素的各个方面。

Tag对象的标准属性

name、attrs、string和contents属性是BeautifulSoup库中Tag对象的标准属性

name:表示元素的标签名称。可以通过访问name属性来获取元素的标签名称。

attrs:表示元素的属性,是一个字典对象。可以通过访问attrs属性来获取元素的属性字典(attrs返回的是字典)

string:表示元素的文本内容。可以通过访问string属性来获取元素的文本内容。

contents:表示元素的子节点列表。可以通过访问contents属性来获取元素的子节点列表。


常见的Tag对象属性


tag:表示元素的标签名称。
text:表示元素的文本内容。
attrib:表示元素的属性,是一个字典对象,可以通过访问attrib属性来获取标签包含的属性。
tail:表示元素的尾部文本内容。
prefix:表示元素的命名空间前缀。
nsmap:表示元素的命名空间映射,是一个字典对象。
getparent():返回元素的父元素。
getchildren():返回元素的所有子元素。
getnext():返回元素的下一个兄弟元素。
getprevious():返回元素的上一个兄弟元素。
getroottree():返回元素所在的树对象。
getroottree().getroot():返回元素所在的树的根元素。



这些属性可以通过访问Tag对象的属性来获取或设置相应的值。例如,要获取元素的标签名称,可以使用tag属性:element.tag。


正则表达式

正则表达式是一种用于匹配和操作文本模式的工具。它是由一系列字符和特殊字符组成的字符串,用于描述和定义要匹配的文本模式。

正则表达式提供了一种灵活而强大的方式来搜索、替换和验证文本。它可以用于各种编程语言和文本编辑器中,用于处理字符串数据。

基本元素

- 普通字符:表示自身的字符,例如字母、数字、标点符号等。
- 元字符:具有特殊含义的字符,例如.、*、+、?等。
- 字符类:用于匹配一组字符中的任意一个字符,例如[abc]表示匹配字符a、b或c。
量词:用于指定匹配的次数,例如*表示匹配零次或多次,+表示匹配一次或多次,?表示匹配零次或一次。
- 锚点:用于指定匹配的位置,例如^表示匹配字符串的开头,$表示匹配字符串的结尾。
- 转义字符:用于转义特殊字符,例如\.表示匹配实际的点字符。

eg

  • xpath选择所有ul节点下所有class属性值为listmain子节点的表达式:
//ul[@class='listmain']/*

解析步骤:
1. //ul:选择文档中所有ul节点。
2. [@class='listmain']:筛选具有class属性值为listmain的ul节点。
3. /*:选择符合条件的ul节点的所有子节点。

  • 匹配abe,ace,ade的正则表达式
a[bcde]e

解析:
- a:匹配字母 "a"。
- [bcde]:匹配方括号内的任意一个字符,即 "b"、"c"、"d" 或 "e"。
- e:匹配字母 "e"。
 


Beautifulsoup4

常用方法

BeautifulSoup():用于创建一个BeautifulSoup对象,将HTML或XML文档作为参数传递给它。
find():用于查找第一个匹配指定标签和属性的元素。
find_all():用于查找所有匹配指定标签和属性的元素,并返回一个列表。

        find_all()返回所有匹配节点的元素:

from bs4 import BeautifulSoup

# 创建一个BeautifulSoup对象
soup = BeautifulSoup(html, 'html.parser')

# 使用find_all()方法查找所有匹配的节点元素
elements = soup.find_all('tag_name')

# 遍历返回的元素列表
for element in elements:
    # 处理每个匹配的节点元素
    print(element)


select():用于使用CSS选择器语法查找匹配的元素。
get():用于获取元素的属性值。
text:表示元素的文本内容。
parent:表示元素的父元素。
children:返回元素的所有子元素。
next_sibling:返回元素的下一个兄弟元素。
previous_sibling:返回元素的上一个兄弟元素。
prettify():用于美化输出,将解析后的文档格式化为易读的字符串。


json库

dumps()

就着重讲一下它吧,之后我会进行其它补充

dumps()方法用于将Python对象转换为JSON格式的字符串。

通过使用dumps()方法,可以将Python对象转换为JSON字符串,以便在网络传输、存储或与其他系统进行数据交换。

基本语法

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

参数说明:

obj:要转换为JSON字符串的Python对象。
skipkeys:如果设置为True,则在转换过程中跳过非字符串键的字典项,默认为False。
ensure_ascii:如果设置为False,则允许输出非ASCII字符,默认为True。
check_circular:如果设置为False,则允许循环引用,默认为True。
allow_nan:如果设置为False,则不允许输出NaN、Infinity和-Infinity,默认为True。
cls:用于自定义JSON编码的编码器类。
indent:用于指定缩进级别的整数值,用于美化输出。
separators:用于指定分隔符的元组,包括(item_separator, key_separator)。
default:用于指定自定义对象的序列化函数。
sort_keys:如果设置为True,则按键进行排序,默认为False。

eg

import json

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

json_str = json.dumps(data)

print(json_str)

在上述示例中,我们定义了一个Python字典对象data,然后使用dumps()方法将其转换为JSON字符串。最后,我们打印输出JSON字符串。

输出结果将是一个JSON格式的字符串:

{"name": "John", "age": 30, "city": "New York"}

eg2

  • json库实现对JSON格式的字符串和Python数据类型进行转化的方法

1. json.loads():将JSON格式的字符串转换为Python数据类型。
- 语法:json.loads(json_str)
- 参数:json_str 是一个包含JSON格式数据的字符串。
- 返回值:返回一个对应的Python数据类型,如字典、列表、字符串等。

json.loads()方法将JSON字符串转换为Python数据类型:

import json

json_str = '{"name": "John", "age": 30, "city": "New York"}'

data = json.loads(json_str)

print(data)
print(type(data))

输出结果将是一个Python字典对象:

{'name': 'John', 'age': 30, 'city': 'New York'}
<class 'dict'>

2. json.dumps():将Python数据类型转换为JSON格式的字符串。
- 语法:json.dumps(data)
- 参数:data 是一个Python数据类型,如字典、列表、字符串等。
- 返回值:返回一个对应的JSON格式的字符串。

json.dumps()方法将Python数据类型转换为JSON字符串:

import json

data = {
"name": "John",
"age": 30,
"city": "New York"
}

json_str = json.dumps(data)

print(json_str)
print(type(json_str))

在上述示例中,我们定义了一个Python字典对象data,然后使用json.dumps()方法将其转换为JSON字符串。最后,我们打印输出转换后的JSON字符串以及其类型。

输出结果将是一个JSON格式的字符串:

{"name": "John", "age": 30, "city": "New York"}
<class 'str'>

设置输出中文字符

可以通过设置ensure_ascii参数为False来实现

import json

data = {
"name": "张三",
"age": 30,
"city": "北京"
}

json_str = json.dumps(data, ensure_ascii=False)

print(json_str)

在上述示例中,我们定义了一个包含中文字符的Python字典对象data,然后使用dumps()方法将其转换为JSON字符串,并将ensure_ascii参数设置为False。最后,我们打印输出JSON字符串。

输出:

{"name": "张三", "age": 30, "city": "北京"}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值