3.4 XPath、Beautiful Soup 与 Pyquery的基本使用总结和比较

目录

一、三者共同点

二. 三者差异与基本使用

(一). 使用示例:

(二). XPath

(三). Beautiful Soup

(四). pyquery

(五). 三者差异

三.练习实战


一、三者共同点

        导入,获得网页文本,str 和 bytes 类型均可作为参数传入。

import requests
from lxml import etree    # XPath
from bs4 import BeautifulSoup
from pyquery import PyQuery as pq


url = ''    
response = requests.get(url)    # 获得响应
content =  response.text    # 获得网页文本,.text获得 str 类型
# content = response.content # .content 获得 bytes 类型

二. 三者差异与基本使用

(一). 使用示例:

content = '''
<div class="panel">
    <div class="panel-heading">
        <h4 href="h4_1">Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''

(二). XPath

  • 获得网页文本后,解析及解析得到的类型:
html = etree.HTML(content)    # 获得解析对象
# print(html, type(html)) # <Element html at 0x21626b253c0> <class 'lxml.etree._Element'>
# purpose_content = html.xpath()    # 开始解析

purpose_content = html.xpath('//ul[@class="list list-small"]')
# purpose_content = html.xpath('//ul[contains(@class, "score")]') 等同上句
print(purpose_content, type(purpose_content)) # <class 'list'>

li_text = html.xpath('//li/text()')
print(li_text)
# [<Element ul at 0x181e8f79800>] <class 'list'>
# ['Foo', 'Bar', 'Jay', 'Foo', 'Bar']

        可以看到 .xparh 解析得到的类型为 Element,是列表,所以可以遍历内容对其中的节点元素进行操作,即也可以 .xpath 解析。

        如果 class 内容较长,可用 contains 。

  • 解析匹配规则:
大多以 // 开头,/子节点,./表示本身
例如: 
属性匹配 ://div[@属性=“ ”]/li/a/text()    获得文本,注意里面是双引号
是指匹配 div 里的属性
//div/@class   获得 div 节点中的属性:
在 li 节点,获取其文本:./text() 

        详细内容见:3.1 XPath的使用-CSDN博客

(三). Beautiful Soup

  • 获得网页文本后,获得解析对象:
soup = BeautifulSoup(content, 'lxml')
print(soup, type(soup))
# 输出 content 内容和 <class 'bs4.BeautifulSoup'>
  • 解析方法和解析得到的类型、获取属性:
# 节点选择器
purpose_content = soup.div.h4
print(purpose_content,type(purpose_content))
# <h4>Hello</h4> <class 'bs4.element.Tag'>
print(purpose_content.string)
# 对节点进行获取文本 输出:Hello
print(purpose_content.attrs['href'])
# 等同 print(purpose_content['href'])


# 方法选择器
purpose_content = soup.find_all('ul', class_='list')    # 指 ul 的class
print(purpose_content,type(purpose_content))
# 输出一个 节点文本列表 和 <class 'bs4.element.ResultSet'>


# css 选择器
purpose_content = soup.select('div ul li')  # 空格往子节点去
purpose_content2 = soup.select('.list')
# 若 class="word1 word2",则('.word1.word2')
print(purpose_content,type(purpose_content))
# 输出 列表 和 <class 'bs4.element.ResultSet'>

        可以看到 soup. 解析后得到的是 Tag 或者 ResultSet 类型,分别对应单个内容列表,但都可以继续解析通过 . 往后解析和获得属性。

        详细内容见:3.2 Beautiful Soup 的使用-CSDN博客

(四). pyquery

  • 获得网页文本后:
doc = pq(content)
print(doc, type(doc))
# 输出 content 内容 和 <class 'pyquery.pyquery.PyQuery'>
  • 解析方法和解析得到的类型、获取属性:
# 直接使用 CSS 选择器
h4 = doc('h4')  # 单个节点
print(h4, type(h4))
# 节点内容 和 PyQuery类型
print(h4.text()) # 纯文本,.html()获取 html文本

lis = doc('.list li')   # 多个节点
print(type(lis))    # PyQuery 类型
items = lis.items()
for item in items:
    print(item.text())  # Foo Bar Jay Foo Bar
# doc()会直接包含,只要有 list 的class 就会算进去

        可以看到都是 PyQuery 类型,可直接通过 . 解析,注意单个节点和多个节点,多个节点需使用 .items 方法获取生成器,迭代获得内容。

        详细内容可见:3.3 pyquery 的使用-CSDN博客

(五). 三者差异

  • XPath 主要通过 常用规则 .xpath() 解析,例如://,/,./等;
  • Beautiful Soup 可用节点选择器( soup.节点.节点.),方法选择器(soup.find_all / find),CSS选择器(soup.select(' CSS规则')) 解析;
  • PyQuery 主要通过 doc('CSS规则') 解析,比 Beautiful Soup 的CSS选择器方便一点;

三者都要注意以下多个节点迭代

三.练习实战

2 三种解析方式爬取王者荣耀英雄图片-CSDN博客

文章到此结束,本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢大家,一起加油吧!

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值