正则
image.png在python中使用正则表达式需要导入re模块
import re # 导入模块
pattern = re.compile('') # 把正则表达式构建为一个pattern对象
# 常用的方法有
# # 从字符串起始位置开始匹配,开头必须符合正则规则,符合返回匹配结果,如果不符合,返回None,单次匹配
re.match()
# 在整个字符串中进行匹配,同样单次匹配,匹配不到,返回None
re.search()
# 在整个字符串中匹所有符合正则规则的结果,列表形式返回,无结果返回空列表
re.findall()
# 在整个字符串中匹所有符合正则规则的结果,返回一个迭代器
re.finditer()
# sub 方法用于替换
re.sub()
# 根据匹配进行切割字符串,并返回一个列表
re.split()
Xpath
xpath:可以在xml中查找信息,对xml文档中的元素进行遍历和属性的提取
xml:被设计的目的,是为了传输数据,结构和html非常相像,是一种标记语言
- xpath常见语法:
nodename(节点名称):选取此节点的所有子节点
/ 从根节点开始查找
// 匹配节点不考虑节点位置
. 选取当前节点
.. 选取当前节点的父节点
@ 获取标签属性 a/@href
a/text() 获取标签文本
a[@class='123'] 根据class属性寻找标签
a[@id='123'] 根据id属性寻找标签
a[@id='123'][last()] 取最后一个id为123的a标签
a[@id='123'][postion()<2] 取前两个id为123的a标签
from lxml import etree
html_element = etree.HTML(html)#将html转化# 按字符串序列化HTML文档
result = etree.tostring(html_element))
lxml 可以自动修正 html 代码,例子里不仅补全了 li 标签,还添加了 body,html 标签。
文件读取
除了直接读取字符串,lxml还支持从文件里读取内容。我们新建一个hello.html文件:
from lxml import etree
# 读取外部文件 hello.html
html = etree.parse('./hello.html')
result = etree.tostring(html, pretty_print=True)
print(result)
1.获取所有的 <li> 标签
result = html.xpath('//li')
2.继续获取<li> 标签的所有 class属性
result = html.xpath('//li/@class')
3.获取最后一个 <li> 的 <a> 的 href
result = html.xpath('//li[last()]/a/@href')
4.获取倒数第二个元素的内容
result = html.xpath('//li[last()-1]/a')
Beautiful
1.首先需要导入bs4库
from bs4 import BeautifulSoup
2.创建BeautifulSoup对象
soup = BeautifulSoup(html)
3.四大对象种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag 标签
- NavigableString
- BeautifulSoup
- Comment
- Tag 获取标签
soup.title
soup.head
对于 Tag,它有两个重要的属性,是 name 和 attrs
print(soup.name)
# [document] #soup 对象本身比较特殊,它的 name 即为 [document]
print (soup.head.name)
# head #对于其他内部标签,输出的值便为标签本身的名称
print (soup.p.attrs)
# {'class': ['title'], 'name': 'dromouse'}
# 在这里,我们把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。
print (soup.p['class'] # soup.p.get('class'))
# ['title'] #还可以利用get方法,传入属性的名称,二者是等价的
soup.p['class'] = "newClass"
print soup.p # 可以对这些属性和内容等等进行修改
# <p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>
- NavigableString
既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如
print (soup.p.string)
# The Dormouse's story
print (type(soup.p.string))
# In [13]: <class 'bs4.element.NavigableString'>
- BeautifulSoup
BeautifulSoup 对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下
print type(soup.name)
# <type 'unicode'>
print soup.name
# [document]
print soup.attrs # 文档本身的属性为空
# {}
- Comment
Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。
print soup.a
# <a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
print soup.a.string
# Elsie
print type(soup.a.string)
# <class 'bs4.element.Comment'>
遍历文档树
- 直接子节点 :.contents .children 属性
- .content
tag 的 .content 属性可以将tag的子节点以列表的方式输出
print soup.head.contents
#[<title>The Dormouse's story</title>]
- .children 它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。
我们打印输出 .children 看一下,可以发现它是一个 list 生成器对象
print soup.head.children
#<listiterator object at 0x7f71457f5710>
for child in soup.body.children:
print (child)
PyQuery
初始化 有 4 种方法可以进行初始化: 可以通过传入 字符串、lxml、文件 或者 url 来使用PyQuery。
from pyquery import PyQuery as pq
from lxml import etree
#传入字符串
d = pq("<html></html>")
#传入lxml
d = pq(etree.fromstring("<html></html>"))
#传入url
d = pq(url='http://google.com/')
#传入文件
d = pq(filename=path_to_html_file)
现在,d 就像 jQuery 中的 $ 一样了。
- .html()和.text() 获取相应的 HTML 块或者文本内容,
- (selector):通过选择器来获取目标内容,
- .eq(index):根据索引号获取指定元素(index 从 0 开始)
- .find():查找嵌套元素,
- .filter():根据 class、id 筛选指定元素
- .attr():获取、修改属性值,
- 其他操作:
#添加 class
.addClass(value):
#判断是否包含指定的 class,返回 True 或 False
.hasClass(value):
#获取子元素
.children():
#获取父元素
.parents():
#获取下一个元素
.next():
#获取后面全部元素块
.nextAll():
#获取所有不匹配该选择器的元素
.not_(selector):
网友评论