数据爬虫(六):爬虫PyQuery基本使用

PyQuery简介

pyquery相当于jQuery的python实现,可以用于解析HTML网页等。它的语法与jQuery几乎完全相同,对于使用过jQuery的人来说很熟悉,也很好上手。

引用作者的原话就是:

“The API is as much as possible the similar to jquery.” 。

安装

使用 pip 或者 easy_install 都可以。
注意:由于 pyquery 依赖于 lxml ,要先安装 lxml ,否则会提示失败。

  1. 安装lxml:https://pypi.python.org/pypi/lxml/2.3/ (建议直接下载安装包,方便快捷);
  2. 安装pyquery:easy_install pyquery 或者pip install pyquery;
  3. 验证:输入 import pyquery 回车不报错即安装成功

初始化

有 4 种方法可以进行初始化:
可以通过传入 字符串、lxml、文件 或者 url 来使用PyQuery。

1

2

3

4

5

from pyquery import PyQuery as pq

from lxml import etree d = pq(“<html></html>”)#传入字符串

d = pq(etree.fromstring(“<html></html>”))#传入lxml

d = pq(url=‘http://google.com/’) #传入url

d = pq(filename=path_to_html_file) #传入文件

现在,d 就像 jQuery 中的 $ 一样了。

字符串初始化

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

查找所有的li标签。输出结果如下:

1

2

3

4

5

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

URL初始化

1

2

3

from pyquery import PyQuery as pq

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

print(doc('head'))

选出百度网站里面head标签里面的内容。
输出结果如下:

1

<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=Edge"/><meta content="always" name="referrer"/><link rel="stylesheet" type="text/css" href="http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css"/><title>&#231;&#153;&#190;&#229;&#186;&#166;&#228;&#184;&#128;&#228;&#184;&#139;&#239;&#188;&#140;&#228;&#189;&#160;&#229;&#176;&#177;&#231;&#159;&#165;&#233;&#129;&#147;</title></head>

文件初始化

1

2

3

from pyquery import PyQuery as pq

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

print(doc('li'))

基本CSS选择器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

选择id=container和list类下的里标签。空格代表一个嵌套。
输出结果为:

1

2

3

4

5

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

查找元素

子元素

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

print(type(lis))

print(list)

find找出所有li标签。
输出结果为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<class 'pyquery.pyquery.PyQuery'>

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

<class 'pyquery.pyquery.PyQuery'>

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

children

查找所有的直接子元素

1

2

lis = items.children('.active')

print(lis)

查找子元素里类为active类的元素。

父元素

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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)

输出:

1

2

3

4

5

6

7

8

9

10

<class 'pyquery.pyquery.PyQuery'>

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

parents元素

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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)

输出:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<class 'pyquery.pyquery.PyQuery'>

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

还可以加入参数进行筛选。

1

2

parent = items.parents('.wrap')

print(parent)

选取类为wrap的标签。

兄弟元素:

代码:x.siblings()

遍历

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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)

.items()方法,返回一个迭代对象。

1

2

3

4

5

6

7

8

9

10

<class 'generator'>

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

获取信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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)

选取a下属性为href的内容。

1

2

3

<a href="link3.html"><span class="bold">third item</span></a>

link3.html

link3.html

获取文本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

输出:

1

2

<a href="link3.html"><span class="bold">third item</span></a>

third item

获取html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

输出:

1

2

3

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

            

<a href="link3.html"><span class="bold">third item</span></a>

DOM操作

addClass、removeClass增加类和删除类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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') //选择li标签

print(li)

li.removeClass('active') //移除active标签

print(li)

li.addClass('active')  //增加active镖旗啊

print(li)

输出结果:

1

2

3

4

5

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

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

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

修改属性和css

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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')  //把li增加标签name=link。如果已经存在name属性则改变name=link。

print(li)

li.css('font-size', '14px')//设置font-size=14px

print(li)

输出结果:

1

2

3

4

5

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

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

<li class="item-0 active" name="link" style="font-size: 14px"><a href="link3.html"><span class="bold">third item</span></a></li>

remove

1

2

3

4

5

6

7

8

9

10

11

12

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

如果只获取Hello,world
.remove移除。
运行结果:

1

2

Hello, World This is a paragraph.

Hello, World

发布了32 篇原创文章 · 获赞 63 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Byweiker/article/details/104071924