爬虫(九十四)PyQuery的使用方法_java



pyQuery 简介

如果你是一个前端开发人员,我相信你会熟悉 jQuery.js的时代,那可是大大简化了直接操作DOM方式,十分方便,从官网我们可以知道 pyQuery,就是类似于 jQuery ,或者说是 jQuery 的 python 版本的实现,所以说有了这个 jQuery 的基础,我感觉都可以抛弃 BeautifulSoup 了,BeautifulSoup 语法太难搞了,所以以后就用 pyQuery 进行爬虫爬取页面吧



快速入门


其实你可以使用 pyQuery class pq 去加载一个 HTML,XML 文档结构,也可以通过加载网站链接,或者一个文件等


爬虫(九十四)PyQuery的使用方法_java_02


from pyquery import PyQuery as pq
from lxml import etree
import urllib
d = pq("<html></html>")
d = pq(etree.fromstring("<html></html>"))
d = pq(url=your_url)
d = pq(url=your_url,opener=lambda url, **kw: urlopen(url).read())
d = pq(filename=path_to_html_file)

初始化一段HTML


html = '''
<div>
   <ul>
        <li class="first">python3</li>
        <li class="item-first"><a href="fisrt.html">牛逼</a></li>
        <li class="item-zore active"><a href="three.html"><span class="bold">python3 牛逼</span></a></li>
        <li class="item-first active"><a href="four.html">python3 大法好</a></li>
        <li class="item-zore"><a href="five.html">人生苦短,我用python</a></li>
    </ul>
</div>
'''

爬虫(九十四)PyQuery的使用方法_java_03


打印DOM文档


from pyquery import PyQuery as jq
doc = jq(html)
print(doc)

爬虫(九十四)PyQuery的使用方法_java_04


初始化URL


doc = jq(url='http://www.baidu.com')#程序会自动请求url
print(doc('body'))#返回body标签

爬虫(九十四)PyQuery的使用方法_java_05



初始化文件


我们新建一个 test.html 文件,里面输入如下代码


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>
<body>
 
</body>
</html>

我们再新建一个文件 test.py 文件,代码如下


from pyquery import PyQuery as jq
doc = jq(filename="test.html")
print(doc)

接下来运行 test.py


爬虫(九十四)PyQuery的使用方法_java_06


CSS基础选择器

id 选择器


html = '''
<div class="container">
   <ul id="item-wrap">
        <li class="first">python3</li>
        <li class="item-first"><a href="fisrt.html">牛逼</a></li>
        <li class="item-zore active"><a href="three.html"><span class="bold">python3 牛逼</span></a></li>
        <li class="item-first active"><a href="four.html">python3 大法好</a></li>
        <li class="item-zore"><a href="five.html">人生苦短,我用python</a></li>
    </ul>
</div>
'''

from pyquery import PyQuery as pq
jq = pq(html)
print(jq('#item-wrap'))

爬虫(九十四)PyQuery的使用方法_java_07


class 类名选择器


from pyquery import PyQuery as pq
jq = pq(html)
print(jq('.container'))

爬虫(九十四)PyQuery的使用方法_java_08


标签选择器


from pyquery import PyQuery as pq
jq = pq(html)
print(jq('div'))

爬虫(九十四)PyQuery的使用方法_java_09


父子选择器


from pyquery import PyQuery as pq
jq = pq(html)
print(jq('.container ul li'))

爬虫(九十四)PyQuery的使用方法_java_10


还有其他很多各种各样的选择,属性选择器,伪类选择器,等等,可以学习前端的 HTML,CSS,JavaScript, 以及 jQuery,这个非常相似的,就不过多的讲述了



查找元素


查找所有 li 标签子元素


html = '''
<div class="container">
   <ul id="item-wrap">
        <li class="first">python3</li>
        <li class="item-first"><a href="fisrt.html">牛逼</a></li>
        <li class="item-zore active"><a href="three.html"><span class="bold">python3 牛逼</span></a></li>
        <li class="item-first active"><a href="four.html">python3 大法好</a></li>
        <li class="item-zore"><a href="five.html">人生苦短,我用python</a></li>
    </ul>
</div>
'''

from pyquery import PyQuery as pq
jq = pq(html)
print(jq('#item-wrap li'))


查找 li.active 子元素


from pyquery import PyQuery as pq
jq = pq(html)
print(jq('#item-wrap li.active'))



查找 li.active a 子元素


from pyquery import PyQuery as pq
jq = pq(html)
doc = jq('#item-wrap li.active')
a = doc.find('a')
print(a)



也可以直接使用 children() 方法查找子元素


from pyquery import PyQuery as pq
jq = pq(html)
doc = jq('#item-wrap li.active')
a = doc.children()
print(a)

查找父级元素 parent()


from pyquery import PyQuery as pq
jq = pq(html)
doc = jq('#item-wrap')
parent = doc.parent()
print(parent)

爬虫(九十四)PyQuery的使用方法_java_11


查找 #item-wrap .item-first.active的兄弟元素


from pyquery import PyQuery as pq
jq = pq(html)
doc = jq('#item-wrap .item-first.active')
siblings = doc.siblings()
print(siblings)

爬虫(九十四)PyQuery的使用方法_java_12



遍历文档对象


from pyquery import PyQuery as pq
jq = pq(html)
lis = jq('li').items()#.items会是一个生成器
print(type(lis))
for li in lis:
   print(li)

爬虫(九十四)PyQuery的使用方法_java_13



获取属性

获取 a 标签 的 href 属性


from pyquery import PyQuery as pq
jq = pq(html)
a = jq('.item-first.active a')
print(a)
print(a.attr('href'))#定义a标签的href属性用于指定超链接目标的URL。如果用户选择了a标签中的内容,那么浏览器会尝试检索并显示href属性指定的URL所表示的文档,或者执行JavaScript表达式、方法和函数的列表。
print(a.attr.href)

爬虫(九十四)PyQuery的使用方法_java_14



获取文本

获取 a 标签的文本


from pyquery import PyQuery as pq
jq = pq(html)
a = jq('.item-first.active a')
print(a)
print(a.text())

爬虫(九十四)PyQuery的使用方法_java_15


获取 html


from pyquery import PyQuery as pq
jq = pq(html)
li = jq('.item-first.active')
print(li)
print(li.html())

爬虫(九十四)PyQuery的使用方法_java_16



pyQuery DOM 操作



删除,增加 active 类型


from pyquery import PyQuery as pq
jq = pq(html)
li = jq('.item-zore.active')
print(li)
li.removeClass('active')#删除 active 类名
print(li)
li.addClass('active')#增加 active 类名
print(li)

爬虫(九十四)PyQuery的使用方法_java_17


attr、css 属性,样式设置

from pyquery import PyQuery as pq
jq = pq(html)
li = jq('.item-zore.active')
print(li)
li.attr('name', 'link')#增加一个属性
print(li)
li.css('font-size', '14px')#增加一个css
print(li)

爬虫(九十四)PyQuery的使用方法_java_18


移除DOM元素


from pyquery import PyQuery as pq
jq = pq(html)
wrap = jq('.container')
print(wrap.text())
wrap.find('#item-wrap').remove()#找到p标签然后删除
print(wrap.text())
print(wrap)

爬虫(九十四)PyQuery的使用方法_java_19

//pyquery.readthedocs.io/en/latest/

伪类选择器
from pyquery import PyQuery as pq
jq = pq(html)
li = jq('li:first-child')
print(li)
li = jq('li:last-child')
print(li)
li = jq('li:nth-child(2)')
print(li)
li = jq('li:gt(2)')
print(li)
li = jq('li:nth-child(2n)')
print(li)
li = jq('li:contains(second)')
print(li)

爬虫(九十四)PyQuery的使用方法_java_20

更多CSS选择器可以查看


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