摘要:大奉打更人卖报小郎君这个人仙太过正经言归正传从红月开始黑山老鬼稳住别浪跳舞二解析数据是一个可以从或文件中提取数据的库。
目录
序号 | 表达式 | 描述 |
1 | nodename | 选取此节点的所有子节点 |
2 | / | 从根节点选择 |
3 | // | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
4 | . | 选取当前节点 |
5 | .. | 选取当前节点的父节点 |
6 | /text() | 选取当前路径下的文本内容 |
7 | /@xxx | 提取当前路径下标签的属性值 |
8 | |可选符 | 可选择若干个路径//p|//div,在当前路径下选取所有符合条件的p标签和div标签 |
序号 | 表达式 | 描述 |
1 | xpath("./body/div[1]") | 选取body下的第一个div节点 |
2 | xpath("./body/div[ last() ]") | 选取body下最后一个div节点 |
3 | xpath("./body/div[ last()-1 ]") | 选取body下倒数第二个div节点 |
4 | xpath("./body/div[ position()<3 ]") | 选取body下前两个div节点 |
5 | xpath("./body/div[ @class ]") | 选取body下带有class属性的div节点 |
6 | xpath("./body/div[ @class="main" ]") | 选取body下class属性为main的div节点 |
7 | xpath("./body/div[ price>35.00 ]") | 选取body下price元素大于35的div节点 |
import requestsfrom lxml import etreeurl="https://www.qidian.com/rank/yuepiao"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}# 发送请求resp=requests.get(url,headers)e=etree.HTML(resp.text) # 类型转换,把str类型转换成class "lxml.etree._Element"# print(type(e)) # names=e.xpath("//div[@class="book-mid-info"]/h4/a/text()") # 获取小说名称authors=e.xpath("//p[@class="author"]/a[1]/text()") # 获取小说作者# print(names) # ["大奉打更人", "这个人仙太过正经", "从红月开始", "稳住别浪", 。。。]# print(authors) # ["卖报小郎君", "言归正传", "黑山老鬼", "跳舞", "我最白", 。。。]for name,author in zip(names,authors): print(name, ":", author)# 大奉打更人 : 卖报小郎君# 这个人仙太过正经 : 言归正传# 从红月开始 : 黑山老鬼# 稳住别浪 : 跳舞# ... ...
序号 | 解析器 | 使用方法 | 优点 | 缺点 |
1 | 标准库 | BeautifulSoup(html,"html.parser") | 内置标准库,速度适中,文档容错能力强 | Python3.2版本前的文档容错能力差 |
2 | lxml HTML | BeautifulSoup(html, "lxml") | 速度快,文档容错能力强 | 安装C语言库 |
3 | lxml XML | BeautifulSoup(html, "xml") | 速度快,唯一支持XML | 安装C语言库 |
4 | html5lib | BeautifulSoup(html, "html5lib") | 容错能力最强,可生成HTML5 | 运行慢,扩展差 |
from bs4 import BeautifulSouphtml=""" 今天又是美好的一天 早起对自己说:我真美!
百度 """# bs=BeautifulSoup(html, "html.parser")bs=BeautifulSoup(html, "lxml")print(bs.title) # 获取标题 今天又是美好的一天 print(bs.h1.attrs) # 获取h1标签的所有属性 {"class": ["info", "bg"], "float": "left"}# 获取单个属性print(bs.h1.get("class")) # ["info", "bg"]print(bs.h1["class"]) # ["info", "bg"]print(bs.a["href"]) # http://www.baidu.com# 获取文本内容print(bs.title.text) # 今天又是美好的一天print(bs.title.string) # 今天又是美好的一天# 获取内容print("-----", bs.h2.string) # ----- 注释的内容print("-----", bs.h2.text) # -----# string可以获取注释的内容,但是text不能获取注释内容
返回值类型 | 方法 | 功能 | 语法 | 举例 |
Tag | find() | 提取满足要求的首个数据 | bs.find(标签,属性) | bs.find("div", class_="books") |
Tag | find_all() | 提取满足要求的所有数据 | bs.find_all(标签,属性) | bs.find_all("div", class_="books") |
功能 | 举例 |
通过ID查找 | bs.select("#abc") |
通过classa查找 | bs.select(".abc") |
通过属性查找 | bs.select(a[" class="abc" "]) |
功能 | 举例 |
获取标签 | bs.title |
获取所有属性 | bs.title.attrs |
获取单个属性的值 | bs.div.get("class") bs.div["class"] bs.a["href"] |
from bs4 import BeautifulSouphtml=""" 今天又是美好的一天 今天又是美好的一天 好好学习,天天向上 百度 人生苦短,唯有爱情"""bs=BeautifulSoup(html, "lxml")print(bs.title, type(bs.title)) # 获取标题及其类型# 今天又是美好的一天 print(bs.find("div",class_="info"), type(bs.find("div",class_="info"))) # 获取第一个满足条件的标签# 今天又是美好的一天 print(bs.find_all("div", class_="info")) # 得到的是一个标签的列表# [今天又是美好的一天, # 好好学习,天天向上# 百度# ]for item in bs.find_all("div",class_="info"): print(item, type(item))print(bs.find_all("div", attrs={"float":"right"})) # 得到属性为"float":"right"的div标签print("---------------CSS选择器---------------------")print(bs.select("#gb"))print(bs.select(".info"))print(bs.select("div>span")) # [好好学习,天天向上]print(bs.select("div.info>span")) # [好好学习,天天向上]for item in bs.select("div.info>span"): print(item.text) # 好好学习,天天向上
import requestsfrom bs4 import BeautifulSoupurl="https://www.taobao.com/"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers)# print(resp.text) # ... ...bs=BeautifulSoup(resp.text,"lxml")a_list=bs.find_all("a")# print(len(a_list)) # 128for a in a_list: url=a.get("href") # print(url) if url==None: continue if url.startswith("http") or url.startswith("https"): print(url)
序号 | 元字符 | 说明 |
1 | . | 匹配任意字符(不包括/n) |
2 | ^ | 匹配字符串的开头 |
3 | $ | 匹配字符的末尾 |
4 | * | 匹配前一个元字符0到多次 |
5 | + | 匹配前一个元字符1到多次 |
6 | ? | 匹配前一个元字符0到1次 |
7 | {m} | 匹配前一个字符m次 |
8 | {m,n} | 匹配前一个字符m到n次 |
9 | {m,n}? | 匹配前一个字符m到n次,并且取尽可能少的情况 |
10 | // | 对特殊字符进行转义 |
11 | [] | 一个字符的集合,可匹配其中任意一个字符 |
12 | | | 逻辑表达式“或”,比如 a|b 代表可匹配a或者b |
13 | (...) | 被括起来的表达式作为一个元组。findall()在有组的情况下只显示组的内容 |
序号 | 元字符 | 说明 |
1 | /A | 只在字符串开头进行匹配 |
2 | /b | 匹配位于开头或者结尾的空字符串 |
3 | /B | 匹配不位于开头或者结尾的空字符串 |
4 | /d | 匹配任意十进制数,相当于[0-9] |
5 | /D | 匹配任意非数字字符,相当于[^0-9] |
6 | /s | 匹配任意空白字符,相当于[/t/n/r/f/v] |
7 | /S | 匹配任意非空白字符,相当于[^/t/n/r/f/v] |
8 | /w | 匹配任意数字、字母、下划线,相当于[a-zA-Z0-9_] |
9 | /W | 匹配任意非数字、字母、下划线,相当于[^a-zA-Z0-9_] |
10 | /Z | 只在字符串结尾进行匹配 |
11 | [/u4e00-/u9fa5] | 中文 |
序号 | 正则处理函数 | 说明 |
1 | re.match(pattern, string, flags=0) | 尝试从字符串的开始位置匹配一个模式,如果匹配成功,就返回一个匹配成功的对象,否则返回None |
2 | re.search(pattern, string, flags=0) | 扫描整个字符串并返回第一次成功匹配的对象,如果匹配失败,就返回None |
3 | re.findall(pattern, string, flags=0) | 获取字符串中所有匹配的字符串,并以列表的形式返回 |
4 | re.sub(pattern, repl, string, count=0,flags=0) | 用于替换字符串中的匹配项,如果没有匹配的项则返回没有匹配的字符串 |
5 | re.compile(pattern[ ,flags ]) | 用于编译正则表达式,生成一个正则表达式(Pattern)对象,供match()和search()函数使用 |
import res = "I study Python3.8 every day"print("--------match方法,从起始位置开始匹配--------")print(re.match("I", s).group()) # Iprint(re.match("/w", s).group()) # Iprint(re.match(".", s).group()) # Iprint("--------search方法,从任意位置开始匹配,匹配第一个--------")print(re.search("study", s).group()) # studyprint(re.search("s/w", s).group()) # stprint("--------findall方法,从任意位置开始匹配,匹配多个--------")print(re.findall("y", s)) # 结果为数组 ["y", "y", "y", "y"]print(re.findall("Python", s)) # ["Python"]print(re.findall("P/w+./d", s)) # ["Python3.8"]print(re.findall("P.+/d", s)) # ["Python3.8"]print("--------sub方法的使用,替换功能--------")print(re.sub("study", "like", s)) # 将study替换成like I like Python3.8 every dayprint(re.sub("s/w+", "like", s)) # I like Python3.8 every day
爬取数据时,一定要记得先找F12代码,看看和爬取的数据是否一致,若一致,则可直接提取。
import reimport requestsurl="http://www.qiushibaike.com/video/"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers=headers)# print(resp.text)# 先随便找一个视频,看是否能提取到。单引号中的单引号用/转义:/".../"# info=re.findall("", resp.text)# print(info) # [""]info=re.findall("", resp.text)# print(info) # 给出所有URL的相对位置的数组lst=[]for item in info: lst.append("https:"+item)# print(lst)# 循环count=0for item in lst: count+=1 resp=requests.get(item, headers=headers) # 转成二进制存储 with open("video/"+str(count)+".mp4", "wb") as file: file.write(resp.content)print("视频下载完毕")
用正则表达式提取51job网页中的信息
import requestsimport refrom pandas import DataFrame # 网址url = "https://search.51job.com/list/000000,000000,0000,32,9,99,Java%25E5%25BC%2580%25E5%258F%2591,2,1.html"# 获得网页对象res = requests.get(url)# 设置编码格式res.encoding = "gbk" # 职位名# 将要提取的用(.*)表示,每条数据不同的地方用.*表示position_pat = "" position = re.findall(position_pat, res.text) # 公司名company_pat = ".*"company = re.findall(company_pat, res.text) # 工作地点place_pat = ".*?(.*?)" # 非贪婪模式place = re.findall(place_pat, res.text, re.S) # 薪资salary_pat = ".*?(.*?)" # 非贪婪模式salary = re.findall(salary_pat, res.text, re.S) # 将取出的信息放到数据框jobInfo = DataFrame([position, company, place, salary]).T# 设置列名jobInfo.columns = ["职位名", "公司名", "工作地点", "薪资"]print(jobInfo.head()) # 将数据保存到本地jobInfo.to_csv("51job2.csv") 四、pyquery解析数据
1、pyquery
- pyquery库是jQuery的Python实现,就能以jQuery的语法来操作解析HTML文档,易用性和解析速度都很好
- 前提条件:
- 你对CSS选择器与jQuery有所了解
- 非Python标准模块,需要安装
- 安装方式
- pip install pyquery
- 测试方式
- import pyquery
2、pyquery的初始化方式
- 字符串方式
- url方式
- 文件
# 字符串方式from pyquery import PyQuery as pyhtml=""" PyQuery PyQuery
"""doc=py(html) # 创建PyQuery的对象,实际上就是在进行一个类型转换,将str类型转成PyQuery类型print(doc) # 和html一样的内容print(type(doc)) # print(type(html)) # print(doc("title")) # PyQuery
# url方式from pyquery import PyQuerydoc=PyQuery(url="http://www.baidu.com", encoding="utf-8")print(doc) # 获取htmlprint(doc("title")) # 百度一下,你就知道
# 文件from pyquery import PyQuerydoc=PyQuery(filename="a1.html")print(doc) # 获取htmlprint(doc("h1")) # PyQuery
3、pyquery的使用
序号
提取数据
举例
1
获取当前节点
doc("#main")
2
获取子节点
doc("#main").children()
3
获取父节点
doc("#main").parent()
4
获取兄弟节点
doc("#main").siblings()
5
获取属性
doc("#main").attr("href")
6
获取内容
doc("#main").html() doc("#main").text()
from pyquery import PyQueryhtml=""" PyQuery 百度 百度一下
Python学习
"""doc=PyQuery(html)# 获取当前节点print(doc("#main")) # 获取整个div# 获取父节点print(doc("#main").parent()) # 获取整个body# 获取子节点print(doc("#main").children()) # 获取和# # 获取兄弟节点print(doc("#main").siblings()) # 获取print("----------获取属性------------")print(doc("a").attr("href")) # http://www.baidu.comprint("----------获取标签的内容------------")print(doc("#main").html()) # 获取和,div中的所有都获取到了print(doc("#main").text()) # 百度 百度一下, 只获取了div中的文本
4、课堂案例(爬取起点小说网)
import requestsfrom pyquery import PyQueryurl="https://www.qidian.com/rank/yuepiao"headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}resp=requests.get(url,headers)# print(resp.text)# 初始化PyQuery对象doc=PyQuery(resp.text) # 使用字符串初始化方式初始化PyQuery对象# a_tag=doc("h4 a") # 获取h4的a标签# print(a_tag)names=[a.text for a in doc("h4 a")]# print(names) # ["大奉打更人", "这个人仙太过正经", "从红月开始", "稳住别浪",....]authors = doc("p.author a") # 找
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/124512.html
摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...
摘要:下载器下载器负责获取页面数据并提供给引擎,而后提供给。下载器中间件下载器中间件是在引擎及下载器之间的特定钩子,处理传递给引擎的。一旦页面下载完毕,下载器生成一个该页面的,并将其通过下载中间件返回方向发送给引擎。 作者:xiaoyu微信公众号:Python数据科学知乎:Python数据分析师 在爬虫的路上,学习scrapy是一个必不可少的环节。也许有好多朋友此时此刻也正在接触并学习sc...
摘要:在近几年迅速咋程序界掀起了不小的波澜,而关于的第三库也使广大程序员趋之若鹜,今天我们就由浅入深的探讨一下如何使用做一个网络爬虫来抓取一些页面信息。 Python在近几年迅速咋程序界掀起了不小的波澜,而关于python的第三库也使广大程序员趋之若鹜,今天我们就由浅入深的探讨一下如何使用python做一个网络爬虫来抓取一些页面信息。今天我们使用的库(包含python自身携带的库和第三库) ...
摘要:在近几年迅速咋程序界掀起了不小的波澜,而关于的第三库也使广大程序员趋之若鹜,今天我们就由浅入深的探讨一下如何使用做一个网络爬虫来抓取一些页面信息。 Python在近几年迅速咋程序界掀起了不小的波澜,而关于python的第三库也使广大程序员趋之若鹜,今天我们就由浅入深的探讨一下如何使用python做一个网络爬虫来抓取一些页面信息。今天我们使用的库(包含python自身携带的库和第三库) ...
阅读 1291·2023-04-26 01:03
阅读 1906·2021-11-23 09:51
阅读 3299·2021-11-22 15:24
阅读 2661·2021-09-22 15:18
阅读 1009·2019-08-30 15:55
阅读 3456·2019-08-30 15:54
阅读 2230·2019-08-30 15:53
阅读 2386·2019-08-30 15:44