美文网首页
Re、Xpath、Beautiful、PyQuery、

Re、Xpath、Beautiful、PyQuery、

作者: 咻咻咻滴赵大妞 | 来源:发表于2018-12-30 20:13 被阅读0次

    正则

    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):
    

    相关文章

      网友评论

          本文标题:Re、Xpath、Beautiful、PyQuery、

          本文链接:https://www.haomeiwen.com/subject/emfblqtx.html