PyQuery

非常适合会Jquery的用户,正则麻烦,BeautifulSoup难记,那就选择PyQuery。

安装

pip3 install 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)
print(doc('li'))

如果要选择 id 就在前面加# 如果要选择 class 就在前面加 . 这里是选择 li 就直接写li就好了。

  • as 是一个通用做法,就是把上面的一长串取一个昵称 为 pq

结果如下

20170922150608428956152.png

URL 初始化

from pyquery import PyQuery as pq
doc = pq('http://www.52cons.com')
print(doc('head'))

在这里我们直接传入一个 URL 然后直接用 PyQuery 获取它的head

结果如下

20170922150608461848352.png

文件初始化

  1. 首先新建一个文件 demo.html 内容为 字符串初始化 里面html的内容。
  2. 这个文件要和 1.py 在相同目录内。
from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('li'))

结果如下

20170922150608488926427.png

基本 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'))

层级选择,不一定是父子关系,比如li 不一定是 list的子,也可以是孙或者更低级别都可以,只要是嵌套关系就可以。

运行结果

20170922150608541411046.png

查找元素

子元素

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')
# 这里items 查找出的就是 .list 这里面的内容
print(type(items))
print(items)
lis = items.find('li')
# 找 items 里面是 .list 也就是找 .list 里面的 li
print(type(lis))
print(lis)

结果如下

20170922150608611340283.png

直接子元素查找 children
lis = items.children()
print(type(lis))
print(lis)
查找某个class的直接子元素
lis = items.children('.active')
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)

结果如下

20170922150608659356140.png

祖先元素 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')
container = items.parents()
print(type(container))
print(container)

和父元素相差就是多了一个 s

结果如下

20170922150608693110887.png

兄弟元素 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())

注意: .item-0.active 中间没有空格,意思是带 .item-0.active class 的标签。 这个 li 带两个 class

结果如下

20170922150608733213647.png

查找带某class 的兄弟元素
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'))    #这里加个active

结果如下

20170923150613426397085.png

遍历

单个元素

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)

结果

20170923150613453392968.png

多个元素(.items)

迭代,.items是一个方法,不是一个class

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)

结果

20170923150613487817922.png

我们看到lis的类型是 generator, 这样就把所有的 li 都 分别 打印出来了。

获取信息

获取属性 .attr

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)    #方法二和方法一一样

打印同时包含class 为 .item-0和.active 的标签里面的 a 标签

结果如下

20170924150622158671326.png

获取文本 .text()

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

注意 text 后面有括号

结果如下

20170924150622173362641.png

获取html .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)
li = doc('.item-0.active')
print(li)
print(li.html()) 

结果如下

20170924150622188463794.png

DOM操作

removeClass | addClass

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)

首先打印li,然后 移除active标签并打印,然后又添加active并打印

结果如下

20170924150622221388773.png

attr(属性) 、css

修改 或者 添加 属性 以及 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') # 添加一个属性 name="link"
print(li)
li.css('font-size','14px')  #添加一个css属性
print(li)

结果

20170924150622250443279.png

remove()

这个用法比较频繁比如下面这个html, 我们只需要打印 Hello, World 但是如果我们使用 .text就会把 p标签里面的text 也打印出来,这个时候就需要删除p标签和里面的内容,再打印的话就可以只显示 Hello, World 了。

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

结果如下

20170924150622304686557.png

其他DOM 方法

http://pyquery.readthedocs.io/en/latest/api.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)
li = doc('li:first-child')
print(li)
#选择第一个lis
li = doc('li:last-child')
print(li)
#选择第二个li
li = doc('li:nth-child(2)')
print(li)
# 选择第二个li,这里不是从0开始,而是从1开始
li = doc('li:gt(2)')
print(li)
# 选择大于第“3”个li的,也就第4和第五  这里是从0开始计算
li = doc('li:nth-child(2n)')
print(li)
#选择偶数的li  也就是 第二 和第四 个
li = doc('li:contains(second)')
print(li)
# 选择 内容包括 second 的 li 

结果

20170924150622401243988.png

更多 伪类选择器方法 (CSS3 选择器)

http://www.w3school.com.cn/cssref/css_selectors.asp

在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。

"CSS" 列指示该属性是在哪个 CSS 版本中定义的。(CSS1、CSS2 还是 CSS3。)





















































































































































































































































选择器 例子 例子描述 CSS
.*class* .intro 选择 class="intro" 的所有元素。 1
#*id* #firstname 选择 id="firstname" 的所有元素。 1
* * 选择所有元素。 2
element p 选择所有

元素。

1
element,*element*div,p选择所有
元素和所有

元素。

1
element elementdiv p选择
元素内部的所有

元素。

1
element>elementdiv>p选择父元素为
元素的所有

元素。

2
element+*element*div+p选择紧接在
元素之后的所有

元素。

2
[*attribute*][target]选择带有 target 属性所有元素。2
[*attribute*=*value*][target=_blank]选择 target="_blank" 的所有元素。2
[*attribute*~=*value*][title~=flower]选择 title 属性包含单词 "flower" 的所有元素。2
[[*attribute*\=*value*]](http://www.w3school.com.cn/cssref/selector_attribute_value_start.asp)[lang\=en]
:linka:link选择所有未被访问的链接。1
:visiteda:visited选择所有已被访问的链接。1
:activea:active选择活动链接。1
:hovera:hover选择鼠标指针位于其上的链接。1
:focusinput:focus选择获得焦点的 input 元素。2
:first-letterp:first-letter选择每个

元素的首字母。

1
:first-linep:first-line选择每个

元素的首行。

1
:first-childp:first-child选择属于父元素的第一个子元素的每个

元素。

2
:beforep:before在每个

元素的内容之前插入内容。

2
:afterp:after在每个

元素的内容之后插入内容。

2
:lang(language)p:lang(it)选择带有以 "it" 开头的 lang 属性值的每个

元素。

2
element1~*element2*p~ul选择前面有

元素的每个

    元素。
3
[*attribute*^=*value*]a[src^="https"]选择其 src 属性值以 "https" 开头的每个 元素。3
[*attribute*$=*value*]a[src$=".pdf"]选择其 src 属性以 ".pdf" 结尾的所有 元素。3
[*attribute**=*value*]a[src*="abc"]选择其 src 属性中包含 "abc" 子串的每个 元素。3
:first-of-typep:first-of-type选择属于其父元素的首个

元素的每个

元素。

3
:last-of-typep:last-of-type选择属于其父元素的最后

元素的每个

元素。

3
:only-of-typep:only-of-type选择属于其父元素唯一的

元素的每个

元素。

3
:only-childp:only-child选择属于其父元素的唯一子元素的每个

元素。

3
:nth-child(n)p:nth-child(2)选择属于其父元素的第二个子元素的每个

元素。

3
:nth-last-child(n)p:nth-last-child(2)同上,从最后一个子元素开始计数。3
:nth-of-type(n)p:nth-of-type(2)选择属于其父元素第二个

元素的每个

元素。

3
:nth-last-of-type(n)p:nth-last-of-type(2)同上,但是从最后一个子元素开始计数。3
:last-childp:last-child选择属于其父元素最后一个子元素每个

元素。

3
:root:root选择文档的根元素。3
:emptyp:empty选择没有子元素的每个

元素(包括文本节点)。

3
:target#news:target选择当前活动的 #news 元素。3
:enabledinput:enabled选择每个启用的 元素。3
:disabledinput:disabled选择每个禁用的 元素3
:checkedinput:checked选择每个被选中的 元素。3
:not(selector):not(p)选择非

元素的每个元素。

3
::selection::selection选择被用户选取的元素部分。3

官方文档


http://pyquery.readthedocs.io/

Comments
Write a Comment