Re、Xpath、Beautiful、PyQuery、

正则

12990848-99f05271ae202e43.png
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
  1. 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>
  1. NavigableString

既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如

    print (soup.p.string)
    # The Dormouse's story

    print (type(soup.p.string))
    # In [13]: <class 'bs4.element.NavigableString'>
  1. BeautifulSoup
    BeautifulSoup 对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下
    print type(soup.name)
    # <type 'unicode'>

    print soup.name 
    # [document]

    print soup.attrs # 文档本身的属性为空
    # {}
  1. 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'>

遍历文档树

  1. 直接子节点 :.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 中的 $ 一样了。
  1. .html()和.text() 获取相应的 HTML 块或者文本内容,
  2. (selector):通过选择器来获取目标内容,
  3. .eq(index):根据索引号获取指定元素(index 从 0 开始)
  4. .find():查找嵌套元素,
  5. .filter():根据 class、id 筛选指定元素
  6. .attr():获取、修改属性值,
  7. 其他操作:
 #添加 class
.addClass(value):
 #判断是否包含指定的 class,返回 True 或 False
.hasClass(value):
 #获取子元素
.children():
 #获取父元素
.parents():
 #获取下一个元素
.next():
 #获取后面全部元素块
.nextAll():
 #获取所有不匹配该选择器的元素
.not_(selector):

猜你喜欢

转载自blog.csdn.net/weixin_34040079/article/details/87266680