#--Name: PyQuery 详解



0x00 什么是PyQuery?

    这是一个强大又灵活的网页解析库。

    如果你觉得写正则太麻烦,

    如果你觉得BeautifulSoup语法太难记,

    如果你熟悉jQuery,

    那么,PyQuery将会成为你的最佳实践!




0x01 pyquery 用法

    #初始化


    #字符串初始化

    #用例:

    html = '''

    <div>

        <ul>

            <li class="item-0">first item</li>

            <li class="item-1"><a href="link2.html">second item</a></li>

            <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

            <li class="item-1 active"><a href="link4.html">fourth item</a></li>

            <li class="item-0"><a href="link5.html">fifth item</a></li>

        </ul>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)      #初始化PyQuery对象

    print(doc('li'))    #选择li标签





    #URL 初始化

    #用例:

    from pyquery import PyQuery as pq

    doc = pq(url='http://www.baidu.com')

    print(doc('head'))





    #文件初始化

    #用例:

    from pyquery import PyQuery as pq

    doc = pq(filename='demo.html')

    print(doc('head'))





    #基本CSS选择器

    #用例:

    html = '''

    <div id="container">

        <ul class="list">

            <li class="item-0">first item</li>

            <li class="item-1"><a href="link2.html">second item</a></li>

            <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

            <li class="item-1 active"><a href="link4.html">fourth item</a></li>

            <li class="item-0"><a href="link5.html">fifth item</a></li>

        </ul>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    print(doc('#container .list li'))     #选择CSS属性,id前面加 # ,class前面加 . 





    #查找元素

    #用例: 使用find()方法,查找子元素

    html = '''

    <div id="container">

        <ul class="list">

            <li class="item-0">first item</li>

            <li class="item-1"><a href="link2.html">second item</a></li>

            <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

            <li class="item-1 active"><a href="link4.html">fourth item</a></li>

            <li class="item-0"><a href="link5.html">fifth item</a></li>

        </ul>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    items = doc('.list')

    print(type(items)

    print(items)

    lis = items.find('li')          #find()方法较为常用

    print(type(lis))

    print(lis)





    #用例: 使用children() 查找直接子元素

    html = '''

    <div id="container">

        <ul class="list">

            <li class="item-0">first item</li>

            <li class="item-1"><a href="link2.html">second item</a></li>

            <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

            <li class="item-1 active"><a href="link4.html">fourth item</a></li>

            <li class="item-0"><a href="link5.html">fifth item</a></li>

        </ul>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    items = doc('.list')

    lis = items.children()

    print(type(lis))

    print(lis)





    #用例: 使用children() 方法的选择器 选择active

    html = '''

    <div id="container">

        <ul class="list">

            <li class="item-0">first item</li>

            <li class="item-1"><a href="link2.html">second item</a></li>

            <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

            <li class="item-1 active"><a href="link4.html">fourth item</a></li>

            <li class="item-0"><a href="link5.html">fifth item</a></li>

        </ul>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    items = doc('.list')

    lis = items.children('.active')

    print(type(lis))

    print(lis)





    #父元素

    #用例: 使用 parent()方法 选择父元素

    html = '''

    <div id="container">

        <ul class="list">

            <li class="item-0">first item</li>

            <li class="item-1"><a href="link2.html">second item</a></li>

            <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

            <li class="item-1 active"><a href="link4.html">fourth item</a></li>

            <li class="item-0"><a href="link5.html">fifth item</a></li>

        </ul>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    items = doc('.list')

    container = items.parent()

    print(type(container))

    print(container)





    #用例:使用parents()方法 选择父元素

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    items = doc('.list')

    parents = items.parents()

    print(type(parents))

    print(parents)

    #这里我增加了一层 wrap,这样返回了所有的父元素

    

    #下面的选择器 将再次筛选 选择器的选择 让我们看看结果

    parent = items.parents('.wrap')

    print(parent)





    #兄弟元素的选择

    #用例:有关于siblings()的使用

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    li = doc('.list .item-0.active')

    print(li.siblings())





    #用例: 使用siblings()方法,在结果中再次选择

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    li = doc('.list .item-0.active')

    print(li.siblings('.active'))





    #遍历

    #如果选择的是多个元素,我们就要对元素进行遍历

    #用例: 单个元素选择

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    li = doc('.item-0.active')

    print(li))

    




    #用例: 多个元素遍历选择

    #如果我们选择的是多个元素,我们则需要使用items()方法对其遍历

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    lis = doc('li').items()

    print(type(lis))

    for li in lis:

        print(li)





    #获取信息

    

    #用例: 获取属性

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    a = doc('.item-0.active a')

    print(a)

    print(a.attr('href'))       #两种方法是一致的,用来获取属性的值

    print(a.attr.href)





    #用例: 获取文本

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    a = doc('.item-0.active a')

    print(a)

    print(a.text())





    #用例: 获取HTML

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    a = doc('.item-0.active')

    print(a)

    print(a.html())





    #DOM操作

    #用例: addClass 和 removeClass  (老王和隔壁老王)

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    li = doc('.item-0.active')

    print(li)

    li.removeClass('active')

    print(li)

    li.addClass('active')

    print(li)





    #用例: attr 和 css 

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    li = doc('.item-0.active')

    print(li)

    li.attr('name','link')

    print(li)

    li.css('font-size','14px')

    print(li)





    #用例: remove    (相对使用比较频繁噢)

    html = '''

    <div class="wrap">

        Hello,World

        <p>This is a paragraph.</p>

    </div>

    '''

    from pyquery import PyQuery as pq

    doc = pq(html)

    wrap = doc('.wrap')

    print(wrap.text())

    wrap.find('p').remove()

    print(wrap.text())





    #其他DOM方法可以参考PyQuery API

    #http://pyquery.readthedocs.io/en/latest/api.html




    #使用CSS3 特定的伪类选择器,选择特定的标签

    #用例: 伪类选择器

    html = '''

    <div class="wrap">

        <div id="container">

            <ul class="list">

                <li class="item-0">first item</li>

                <li class="item-1"><a href="link2.html">second item</a></li>

                <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>

                <li class="item-1 active"><a href="link4.html">fourth item</a></li>

                <li class="item-0"><a href="link5.html">fifth item</a></li>

            </ul>

        </div>

    </div>

    '''


    from pyquery import PyQuery as pq

    doc = pq(html)

    li = doc('li:first-child')      #选择第1个 li 标签,注意 : 号写法

    print(li)

    li = doc('li:last-child')       #选择最后1个 li 标签

    print(li)

    li = doc('li:nth-child(2))      #选择指定的,第2个li标签   ,child()    序号从1开始

    print(li)

    li = doc('li:gt(2))             #选择序号比3大的,也就是第3个 li 标签之后的 li 标签  (序号从0开始)

    print(li)

    li = doc('li:nth-child(2n))     #选择序号为偶数索引的 li 标签

    print(li)

    li = doc('li:contains(second)') #选择文本部分包含 second 的 li 标签

    print(li)


    #更多CSS选择器可以访问 

    #http://www.w3school.com.cn/css/index.asp




    #PyQuery 官方文档参见

    #http://pyquery.readthedocs.io/