zoukankan      html  css  js  c++  java
  • python解析HTML之:PyQuery库的介绍与使用

    本篇大部分转载于https://www.jianshu.com/p/c07f7cd1b548

    先放自已自己解析techweb一个网站图片的代码

    from pyquery import PyQuery as pq
    
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
                             '(KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}
    
    def get_info(url):
        html = requests.get(url,headers =headers,verify=False)
        d = pq(html.content)
        doc = d("div").filter(".list_con")
        doc = doc("div").filter(".picture_text")
        for tr in doc.items():
            temp =tr.find("img")
            print(temp.attr("src"))
    
    
    if __name__ == "__main__":
        get_info("http://mi.techweb.com.cn/")

    前言

    Python关于爬虫的库挺多的,也各有所长。了解前端的也都知道, jQuery 能够通过选择器精确定位 DOM 树中的目标并进行操作,所以我想如果能用 jQuery 去爬网页那就 cool 了。

    就搜了下看 Python 有没有与 DOM 相关的库什么的,还真找到了—— 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。

    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 中的 $ 一样了。

    示例

    通过一个简单的例子快速熟悉 pyquery 的用法,传入文件 example.html,内容如下:

    <div>
    <tr class="item-0">
    <td>first section</td>
    <td>1111</td>
    <td>17-01-28 22:51</td>
    </tr>
    <tr class="item-1">
    <td>second section</td>
    <td>2222</td>
    <td>17-01-28 22:53</td>
    </tr>
    </div>
    

    python 程序:

    # -*- coding: utf-8 -*-
    from pyquery import PyQuery as pq#引入 PyQuery
    
    doc = pq(filename='example.html')# 传入文件 example.html
    
    print doc.html() # html()方法获取当前选中的 html 块
    
    print doc('.item-1') # 相当于 class 选择器,选取 class 为 item-1 的 html 块
    
    data = doc('tr') # 选取 <tr> 元素
    
    for tr in data.items():# 遍历 data 中的 <tr> 元素
    temp = tr('td').eq(2).text() # 选取第3个 <td> 元素中的文本块
    print temp
    

    运行结果:

    # print doc.html()
    <tr class="item-0">
    <td>first section</td>
    <td>1111</td>
    <td>17-01-28 22:51</td>
    </tr>
    <tr class="item-1">
    <td>second section</td>
    <td>2222</td>
    <td>17-01-28 22:53</td>
    </tr>
    
    # print doc('.item-1')
    <tr class="item-1">
    <td>second section</td>
    <td>2222</td>
    <td>17-01-28 22:53</td>
    </tr>
    
    # print tr('td').eq(2).text()
    17-01-28 22:51
    # print tr('td').eq(2).text()
    17-01-28 22:53
    

    操作

    1、.html().text():获取相应的 HTML 块或者文本内容,

    p=pq("<head><title>Hello World!</title></head>")
    
    print p('head').html()# 获取相应的 HTML 块
    print p('head').text()# 获取相应的文本内容
    
    '''输出:
    <title>hello</title>
    Hello World!
    '''
    

    2、.('selector'):通过选择器来获取目标内容,

    d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")
    
    print d('div').html()# 获取 <div> 元素内的 HTML 块
    print d('#item-0').text()# 获取 id 为 item-0 的元素内的文本内容
    print d('.item-1').text()# 获取 class 为 item-1 的元素的文本内容
    
    '''输出:
    <p id="item-0">test 1</p><p class="item-1">test 2</p>
    test 1
    test 2
    '''
    

    3、.eq(index):根据索引号获取指定元素(index 从 0 开始),

    d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")
    
    print d('p').eq(1).text()# 获取第二个 p 元素的文本内容,
    
    '''输出
    test 2
    '''
    

    4、.find():查找嵌套元素,

    d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")
    
    print d('div').find('p') # 查找 <div> 内的 p 元素
    print d('div').find('p').eq(0) # 查找 <div> 内的 p 元素,输出第一个 p 元素
    
    '''输出:
    <p id="item-0">test 1</p><p class="item-1">test 2</p>
    <p id="item-0">test 1</p>
    '''
    

    5、.filter():根据 class、id 筛选指定元素,

    d = pq("<div><p id='item-0'>test 1</p><p class='item-1'>test 2</p></div>")
    
    print d('p').filter('.item-1') # 查找 class 为 item-1 的 p 元素
    print d('p').filter('#item-0') # 查找 id 为 item-0 的 p 元素
    
    '''输出:
    <p class="item-1">test 2</p>
    <p id="item-0">test 1</p>
    '''
    

    6、.attr():获取、修改属性值,

    d = pq("<div><p id='item-0'>test 1</p><a class='item-1'>test 2</p></div>")
    
    print d('p').attr('id') # 获取 <p> 标签的属性 id
    print d('a').attr('class','new')# 修改 <a> 标签的 class 属性为 new
    
    '''输出:
    item-0
    <a class="new">test 2</a>
    '''
    

    7、其他操作:
    .addClass(value):添加 class;
    .hasClass(name):判断是否包含指定的 class,返回 True 或 False;
    .children():获取子元素;
    .parents():获取父元素;
    .next():获取下一个元素;
    .nextAll():获取后面全部元素块;
    .not_('selector'):获取所有不匹配该选择器的元素;
    for i in d.items('li'): print i.text():遍历 d 中的 li 元素;

    结语

    以上的操作对于日常爬取一些小数据资料,基本足够使用了。当然,PyQuery 还有很多其他内容,这里就不做说明了,如果需要了解更多关于 PyQuery 的内容的可以去查看官方文档。

    官方文档是英文的,但也比较容易阅读和理解。我找到了一个中文的教程网站,这里也提供出来。

    官方文档:https://pythonhosted.org/pyquery/index.html#
    中文教程:http://www.geoinformatics.cn/lab/pyquery/

  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/8810451.html
Copyright © 2011-2022 走看看