失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 正则表达式 bs4解析 xpath解析

正则表达式 bs4解析 xpath解析

时间:2023-11-15 02:52:48

相关推荐

正则表达式 bs4解析 xpath解析

#正则

#bs4 解析

#Xpath解析

正则 re

import re# list = re.findall(r'\d{11}','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')list = re.findall(r'\d+','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')# findall :匹配字符串中所有符合正则的内容 用的并不是太多print(list)# finditer:匹配字符串中所有的内容 ,但返回的是迭代器, 从迭代器中拿到内容需要 .group()it = re.finditer(r'\d+','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')# print(it)for i in it:print(i.group())print('======search====')# search 返回的结果是 match 对象 。拿数据需要 .group()# search 有一个特点: 找到一个结果就返回 第二个取不到s = re.search(r'\d+','我的电话号码是:18047653655,女朋友的电话号码是:15104808753')print(s.group())print('=========match=======')# match 从头开始匹配 相当于^c = re.match(r'\d+','18047653655,女朋友的电话号码是:15104808753')print(c.group())print('========预加载=======')#预加载正则表达式obj = pile(r"\d+")ret = obj.search('我的电话号码是:18047653655,女朋友的电话号码是:15104808753')print(ret.group())# (?P<分组名字>正则) 可以单独从正则匹配的内容中进一步提取内容 .group(“分组名字”)

正则补充:

import re# 匹配单个字符# move = input('请输入你要看的最后一个数字或者字母:')result = re.match(r"速度与激情.", "速度与激情b").group()# result.group()# 匹配多个字符result1 = re.match(r"速度与激情\d{学习计划,2}", "速度与激情22").group()result2 = re.match(r"速度与激情\d{学习计划,3}", "速度与激情342").group()result3 = re.match(r"021-?\d{8}", "02112345678").group()result4 = re.match(r"021-?\d{8}", "021-12345678").group()result5 = re.match(r"\d{3,4}-?\d{7,8}", "0476-4583719").group()html_content = '''冲冲冲加油!'''result6 = re.match(r".*", html_content).group()result7 = re.match(r".*", html_content, re.S).group()

import redef main():names = ['age', '_age', '1age', 'a_age', 'age1', 'age_1_', '1_age']for name in names:ret = re.match(r"^[a-zA-Z_]+$", name) # ^开始匹配的头,$匹配结束的尾if ret:print('变量名:%s 符合要求...通过正则匹配出来的数据是:%s'% (name,ret.group()))else:print('变量名:%s 不符合要求'% name)if __name__ == '__main__':main()

import redef main():email = input('请输入你的邮箱:')# 如果在正则表达式中 需要用到了某些普通的字符,比如 . 比如 ? 等,仅仅需要在他们前面添加一个 反斜杠进行 转义ret = re.match(r"^[a-zA-Z_0-9]{4,20}@(163|126|qq)\.com$", email)if ret:print('%s 符合条件。。。' % email)else:print('%s 不符合条件。。。' % email)if __name__ == '__main__':main()'''学习计划,不要觉得学了正则,一切都可以匹配到,那如果你爬的HTML里面没有加载ip地址呢?首先验证下,ip地址是否存在于HTML,不是通过网页,而是代码返回的response中查看。2,正则表达有问题吧,/这个字符在正则表达式里需要转义符(\)转义的3, 解决问题需要考虑方法和效率, 用XPATH 或 bs4 明显要比 正则表达式简单的多,为什么弃而不用呢? 没学的话,抓紧时间去学。作者:漫步链接:/question/268774697/answer/341512518来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。'''

import redef main():ns_test = '''<div class="job-detail">岗位职责:<br> 学习计划.本职位主要是参与电子数据取证/分析产品模块设计和研发;<br> 2.主语言是python,但会涉及go,要求代码能同时运行Windows与Linux平台;<br> 3.根据项目计划按时完成软件开发和单元测试工作以及Bug修复;<br> 4.不断学习并运用新的知识提升产品竞争力。<br>任职要求:<br> 学习计划.本科及以上学历,思维清晰,沟通良好,具备良好的分析、理解、解决问题的能力;<br> 2.理解数组,链表,树的等基本数据结构。了解设计模式;<br> 3.至少有python 1年以上实际项目经验;<br> 4.了解Linux常用命令,了解TCP/IP协议簇;<br> 5.熟悉git基本操作。<br><br>加分项:<br> 学习计划.维护技术博客/公众号,或者有开源项目者优先;<br> 2.有C++/go开发基础者;<br> 3.有Linux下开发经验者;<br> 4.有Windows维护经验者(了解注册表,Powershell之类)。</div>'''ret = re.sub(r"<br>", '', ns_test)print(ret)if __name__ == '__main__':main()

案例 豆瓣top250

import requestsimport reimport csvurl = '/top250'heades = {# headers'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}rsep = requests.get(url,headers=heades)page_content = rsep.text #源代码#解析数据obj = pile(r'<li>.*?<span class="title">(?P<name>.*?)</span>.*?<br>(?P<year>.*?)&nbsp.*?<span class="rating_num" property="v:average">(?P<pf>.*?)</span>.*?'r'<span>(?P<num>.*?)人评价</span>',re.S)ret = obj.finditer(page_content)f = open("data.csv", mode='w',encoding='utf-8')csvwriter = csv.writer(f)for page in ret:dic = page.groupdict()dic["year"] = dic["year"].strip()csvwriter.writerow(dic.values())f.close()print('完成!')# print(page.group("name"))# print(page.group("year").strip())# print(page.group("pf"))# print(page.group("num"))

案例:

3_2_屠戮盗版天堂.py

#最新影片推荐提取import requestsimport reimport csvurl = '/index.htm'# /html/gndy/dyzz/0505/61398.htmlheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}resp = requests.get(url , verify=False) #verify=False 去掉安全验证# charset=gb2312resp.encoding = 'gb2312' #指定字符集 ,系统默认 utf-8page_c = resp.text# ret = pile(r"最新影片推荐.*?<ul>.*?<a href='.*?'>(?P<name>.*?)</a>.*?</ul>",re.S)# ret = pile(r"最新影片推荐.*?<ul><tr><a href=(?P<UL>'.*?')>(?P<name>.*?)</a><br/></tr>.*?</ul>",re.S)obj1 = pile(r"最新影片推荐.*?<ul>(?P<name>.*?)</ul>",re.S)obj2 = pile(r"<a href='(?P<href>.*?)'",re.S)# <div class="title_all"><p>最新影片推荐</p></div># <div class="co_content4"># <ul># <tr># <a href='/html/gndy/dyzz/0427/61361.html'>高分纪录片《地球改变之</a><br/># </tr>ret1 = obj1.finditer(page_c)child_href_list = []for i in ret1:ul = i.group("name")# print(ul)# print(i.group("name"))#提取子页面连接ret2 = obj2.finditer(ul)for it in ret2:print(it.group("href"))# 拼接子页面的url地址 : 域名+ 子页面地址child_href = url + it.group("href").strip('/')child_href_list.append(child_href) # 保存子页面连接#提取子页面内容for ran in child_href_list:respons = requests.get(ran,verify=False)respons.encoding = 'gb2312'print(respons.text)break # 本人声明: 我这个网址有问题所以提取子页面内容的部分先 过 不是说我不会

bs4使用案例:

import requestsfrom bs4 import BeautifulSoupimport csv#1.拿到页面源代码 ,2.使用bs4进行解析,拿到数据url = '/marketanalysis/0/list/1.shtml'hearders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}resp = requests.get(url,headers=hearders)# print(resp.text)f = open("蔬菜.csv",mode='w',encoding='utf-8')csvwriter = csv.writer(f)# 解析数据#把页面源代码交给 BeautifulSoup 进行处理,生成bs对象page = BeautifulSoup(resp.text,"html.parser") #"html.parser" 告诉BeautifulSoup 我是html 不告诉的话会出现警告# 从bs对象中查找数据 : find(标签,属性=值) 就找第一个 find_all() 全都找出来# table = page.find("table",class_="hq_table") # class是python的关键字table = page.find("table",attrs={"class":"hq_table"}) #和上一行一个意思print(table)#拿到所有数据行trs = table.find_all("tr")[1:]for tr in trs: #每一行tds = tr.find_all("td") # 拿到每一行中的所有tdname = tds[0].text # .text 表示拿到被标签标记的内容low = tds[1].text # .text 表示拿到被标签标记的内容avg = tds[2].text # .text 表示拿到被标签标记的内容gui = tds[3].text # .text 表示拿到被标签标记的内容king = tds[4].text # .text 表示拿到被标签标记的内容baby = tds[5].text # .text 表示拿到被标签标记的内容high = tds[6].text # .text 表示拿到被标签标记的内容csvwriter.writerow([name,low,avg,gui,king,baby,high])f.close()print('over!')

抓取优美图库bs4:

from bs4 import BeautifulSoupimport requestsimport timeimport csvurl = '/bizhitupian/weimeibizhi/'hearders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}# charset=utf-8"resp = requests.get(url, headers=hearders)resp.encoding = 'utf-8'# print(resp.text)rot = BeautifulSoup(resp.text, "html.parser")table = rot.find("div", class_="TypeList").find_all("a") # 范围第一次缩小# print(table)for a in table:href=a.get("href") # 直接通过 get 就可以拿到属性的值# print(href)# 那子页面的源代码child = requests.get(href)child.encoding = 'utf-8'child_text = child.text# 从子页面中拿到图片的下载路径child_page = BeautifulSoup(child_text, 'html.parser')p_img = child_page.find('p', align="center").find('img')src = p_img.get("src")# print(p_img.get("src"))#图片的下载img_a = requests.get(src)# img_a.content # 这里拿到的是字节img_name = src.split("/")[-1] #拿到url 中最后一个/以后的内容with open("img/"+img_name ,mode= "wb" ) as f:# with open('相册', mode="wb") as f:f.write(img_a.content) #图片内容 写入文件print('over!!!')time.sleep(1)f.close()

xpath解析:

# xpath 是在 XML 文档中搜索内容的一门语言# html 是 xml 的一个子集from lxml import etree'''/html/body/ul/li/a href=""/ol/a/div class=""'''#xpath 解析xml = []tree = etree.XML(xml)tree1 = etree.parse("b.html")# tree.xpath("/book") # / 表示层级关系 ,第一个/是根节点# tree.xpath("/book/name")ret1 = tree.xpath("/html/book/name/text()")#text() 拿文本ret2 = tree.xpath("/html/book/body/ul/li/a/text()")#text() 拿文本ret3 = tree.xpath("/html/book/body/ul/li[1]/a/text()")# Xpath 的顺序是从1开始数的 text() 拿文本 []表示的是 索引ret4 = tree.xpath("/html/book/body/ul/ol/li/a[@href='dapao']/text()") #[@xxx= "xxx"] 是属性的筛选ret6 = tree.xpath("/html/book/body/ul/ol[2]/a/text()")ol_li_list = tree.xpath("/html/body/ol/li")for i in ol_li_list:#从每个li中提取到文字信息result = i.xpath("./a/text()") # ./ 属于相对查找 在这里就是相对于 li 进行查找print(result)# 提取出 a 标签 href的值result2 = i.xpath("./a/@href") #拿属性值 @属性print(result2)print("")

xpath实战猪八戒网:

import requestsfrom lxml import etreeimport csvurl = '/search/f/?type=new&kw=python'# kw = input("输入要查找的语言:")params ={'type' : 'new','kw' : 'python',}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}resp = requests.get(url,headers=headers)html = etree.HTML(resp.text)# print( resp.text)# tree = etree.parse()f = open("数据.csv" , mode='w' , encoding= 'utf-8 ')csvwriter = csv.writer(f)# 服务商的divdivs = html.xpath('/html/body/div[6]/div/div/div[2]/div[6]/div[1]/div')# print(divs)for div in divs: #每一个服务商的信息# html1 = etree.HTML(divs.text)span = div.xpath("./div/div/a[1]/div[2]/div[1]/span[1]/text()")[0].strip("¥")p = "python".join(div.xpath("./div/div/a[1]/div[2]/div[2]/p/text()"))com_name = div.xpath("./div/div/a[2]/div/p/text()")[0]location = div.xpath("./div/div/a[2]/div/div/span/text()")[0]csvwriter.writerow([span,p,com_name,location])# print(location)# // *[ @ id = "utopia_widget_51"] / a[1] / div[2] / div[1] / span[1]# / html / body / div[6] / div / div / div[2] / div[6] / div[1] / div[1]#<div class='service-shop clearfix'># /html/body/div[6]/div/div/div[2]/div[6]/div[1]#<p class='text-overflow'><img src='/static/nodejs-zbj-search-api/widget/localize-service/img/shop_9088d78.png'/>拓冠科技-行业之星服务商</p>print("完成!!")f.close()

如果觉得《正则表达式 bs4解析 xpath解析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。