目录
一、三者共同点
二. 三者差异与基本使用
(一). 使用示例:
(二). XPath
(三). Beautiful Soup
(四). pyquery
(五). 三者差异
三.练习实战
一、三者共同点
导入,获得网页文本,str 和 bytes 类型均可作为参数传入。
import requests
from lxml import etree # XPath
from bs4 import BeautifulSoup
from pyquery import PyQuery as pqurl = ''
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博客
文章到此结束,本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢大家,一起加油吧!