怎么做车载mp3下载网站,asp框架商城网站模板,广州公司注册网站官网,最好的cms开源目录
一、待匹配数据获取
二、正则
三、bs4
#xff08;一#xff09;、访问属性
#xff08;二#xff09;、获取标签的值 #xff08;三#xff09;、查询方法 四、xpath
后续#xff1a;登录和代理 上一节我们已经知道了如何向服务器发送请求以获得数据#x…目录
一、待匹配数据获取
二、正则
三、bs4
一、访问属性
二、获取标签的值 三、查询方法 四、xpath
后续登录和代理 上一节我们已经知道了如何向服务器发送请求以获得数据今天我们就来学习如何从获得的数据中找到自己需要的东西使用数据解析的三种工具正则、bs4、xpath。
一、待匹配数据获取
我们今天来试试国家数据网页尝试获取下面这个框里面所有链接的url。 我们先右键网页查看页面源代码psF12元素里面的代码是网页的实时代码和源代码有差异。然后CtrlF搜索 2020年投入产出表可以看到有结果前面的超链接就是我们需要的url。这表明数据是直接在网页源码中的而不是通过脚本二次请求服务器生成的可以直接通过页面源码找到。 接下来使用上一节的代码来获取页面源代码。
import requestsurl https://data.stats.gov.cn/
headers {# 用户代理某些网站验证用户代理微微改一下如果提示要验证码之类的使用它User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0,
}
with requests.get(urlurl, headersheaders,) as resp:resp.encoding utf-8print(resp)with open(国家数据.html, modew,encodingutf-8) as f:f.write(resp.text) # 读取到网页的页面源代码 我们下面的操作就只读取下载的html文件而不反复请求服务器。
二、正则 使用正则表达式来匹配数据在很多python基础中都有速度快能适应复杂的需求但是复杂的正则表达式不好写难维护容易出错。不过那些大语言模型写正则是一把好手。这里主要爬虫关于正则表达式给几个表看一看用用就会了。这里贴一下python文档链接和几个表以待后续查看正则表达式指南 — Python 3.11.10 文档 import re # 正则 findall() 以列表形式返回所有满足数据没有返回空列表 finditer() 返回所有匹配结果的迭代器建议使用forgroup提取 search() 返回第一个匹配结果的match对象使用group提取没有返回None match() 从头开始匹配返回match对象。 相当于在正则表达式前面加了^,没有返回None compile()预加载正则表达式 量词 意义 * 0~∞次 1~∞次 ? 0~1次 {n} n次 {n,} n~∞次 {n,m} n~m次
元字符意义.换行符以外任意字符\w字母数字下划线\s空白字符空格 换行符 制表符\d数字\W非字母数字下划线\S非空白字符\D非数字\n换行符\t制表符^字符串开始$字符串结尾a|b字符a或字符b()匹配括号内的表达式[abc]匹配字符a或b或c[^abc]匹配除了a、b、c的字符
规则意义re.I忽略大小写re.L不建议使用改用re.Ure.M多行匹配re.S令 . 可以匹配换行符re.U使用unicode字符集re.X忽略匹配表达式中的空白符和#除非加\,令你可以在正则表达式中加注释 一个小细节.*会贪婪匹配越多越好.*?会非贪婪匹配越少越好 好基础知识都在上面现在我们来尝试匹配网页吧。 通过在网页中查看我们发现需要获取的url前后有lia href和.产出表/aspan所以我们可以根据这一点来写正则表达式最终形成如下代码
import re
path 国家数据.html
with open(path,moder, encodingutf-8) as f: # 下载源码data f.read()
regular re.compile(rlia href(?Purl.*)(?Pyear.*)投入产出表/aspan)
result_1 regular.findall(data)
result_2 regular.finditer(data)
result_3 regular.search(data)
result_4 regular.match(data)
print(result_1)
for i in result_2:print(i.group())print(i.group(url))print(i.group(year))
print(result_3.group())
print(result_4) 这里面()划定了一个组而?Pname给组起了一个名字结果如下 finditer返回的迭代器是我最常用也是我觉着最好用的。
三、bs4 bs4全称beautifulsoup4。它主要是创建解析树用来导航、搜索、修改HTML和XML文档效率可能比其他的略低但比较健壮不易出错。 from bs4 import BeautifulSoup # bs 基础用法就是先使用 bs BeautifulSoup(data, html.parser) 将html代码交给bs4处理为树形结构然后在得到的bs对象中查找需要的数据。 处理后数据是一个BeautifulSoup即文档文档中有许多tag标签标签也能够包含标签就像上图的div、a、li一样。我们可以通过bs.ul来访问第一个ul标签。有的标签具有属性像是最外层的div标签就有id属性、第一个a有href属性一样。可以像是访问字典一样通过bs.ul.li.a[href]或者bs.ul.li.a.get(href)来访问属性的值。如果属性有多个值或者属性名字为class会返回列表。 除了tag以外还有NavigableString标签的值以及Comment注释和特殊字符串标签的值一般是字符串字符串中无法包含其他标签同时无法编辑只能替换。可以通过.string、.text获取标签的字符串。若标签内非字符串第一种返回None第二种会将内容转化为纯文本输出 我们要筛查的话可以使用find()或者find_all()方法来的到一个对象或者所以符合要求的对象
find_all比find只多了一个limit参数其他的参数相同 好总结一下。
一、访问属性 标签[属性名] 标签(属性名) class返回列表其他的返回字符串 二、获取标签的值 .string 空返回None .text 返回内容纯文本 三、查询方法 find(name , attrs , recursive , string) find_all(name , attrs , recursive , string, limit) 标签名属性名和属性值class_特殊搜索全部子孙节点字符串内容最大返回数 除此之外还有css选择器但我没看觉得不够用的可以再去学习一下。 利用上述知识我们可以使用下面代码获得所需数据了
from bs4 import BeautifulSoup # bspath 国家数据.html
with open(path, moder, encodingutf-8) as f: # 下载源码data f.read()
bs BeautifulSoup(data, html.parser) # html代码交给bs处理
ul bs.find(ul, class_active clearfix) # 查找标签名为ul,属性class值为”active clearfix“的tag
data ul.find_all(a) # 查找所有a标签
for i in data:print(i[href], i.string) 很简短不是吗。 四、xpath 这东西比bs快点而且有开发工具加持能够精准定位。它和bs4挺像的是一种专门用于XML文档定位和选择节点的语言。但用起来也挺难这里说点简单的先用上。 from lxml import etree # 导入 xpath的节点就像是上面的tag树形结构跟文件夹似的使用etree.HTML(data)来处理数据。 首先是xpath支持路径表达式和我们常见的文件路径相似
/根节点开始//不考虑位置.当前节点..父节点选取属性*通配符任何|或nodename所有子节点text()获取文本 我们可以通过.xpath来执行路径表达式。比如还是上文中的登录部分我们想获取登录的文本可以使用tree.xpath(/html/body/div[2]/div/div/ul/li[1]/a/text())来得到结果什么很长长就对了这就就不是给人数的。注意它的下标从1开始 这就要说到上面的开发工具加持了打开开发工具的元素页面右键需要的元素就能够直接复制元素的Xpath地址了。 我们再来看看这条代码tree.xpath(//*[idtop]/div/div/ul/li[1]/a/text())照样能找到位置它用了谓语表达式[idtop]代表标签有个叫id的属性值为top,还能写出一些其他的谓语表达式比如[last()]表示最后一个节点[text()登录]选择文本为登录的节点[id1]选择id值大于1的节点等。 xpath还有一些接口
xpath()路径表达式获取节点列表find()查第一个匹配的节点findall()查所有匹配节点text获取文本内容attrib获取节点属性 好的现在我们开始获取所需数据吧要获得想要元素的位置一点点找太麻烦了我们可以使用左上角的检查工具然后鼠标移动到所需的数据上就能知道这个数据是从哪段代码中显示的了。 from lxml import etreepath 国家数据.html
with open(path, moder, encodingutf-8) as f: # 下载源码data f.read()
tree etree.HTML(data)
ul1 tree.xpath(/html/body/div[6]/div[3]/div[2]/div[2]/ul[1])[0]
ul2 tree.xpath(//ul[classactive clearfix])[0]
print(ul1 ul2)
out_data ul1.xpath(./li/a)
print(out_data ul1.findall(li/a))
print(out_data tree.xpath(//ul[classactive clearfix]//a))
for i in out_data:print(i.attrib[href],i.text)
方法很多选种喜欢的用就行。
注意上面获得的url前面拼接上原网址才是完整url。
后续登录和代理
改天写如何处理登录以及代理详情见三、登录以及代理。