爬虫正则+bs4+xpath+综合实战详解

Day3 - 1.数据解析概述_哔哩哔哩_bilibili

聚焦爬虫:爬取页面中指定的页面内容

                编码流程:指定url -> 发起请求 -> 获取响应数据 -> 数据解析 -> 持久化存储

数据解析分类:正则、bs4、xpath(本教程的重点)

数据解析原理概述:解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储

                                1.进行指定标签的定位
                                2.标签或者标签对应的属性中存储的数据值进行提取(解析)

图片的爬取

图片是以二进制方式存储的,复制图片链接输入浏览器可以得到图片对应的url

import requestsurl = 'https://img-blog.csdnimg.cn/09ad194be31144e9b628bcd26916c144.png'
# content返回二进制形式的图片数据
image_data = requests.get(url).contentwith open('picture.png', 'wb') as fp:fp.write(image_data)

由于糗事百科停运了,所以找了个美女照片网站

美女写真图片大全_3g壁纸 (3gbizhi.com)

对图片进行检查,看到图片的url都是放在img标签里的,而src后面的值就是它的url

观察图片的层级关系,发现都在<ul class="cl">下,在<li class>中

import re
import requests
import osif not os.path.exists('./girls_picture'):os.makedirs('girls_picture')url = 'https://www.3gbizhi.com/meinv/mnxz/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
response = requests.get(url, headers=headers)
page_text = response.text# 使用聚焦爬虫对页面的信息进行解析
ex = '<li class="box_black">.*?<img src="(.*?)" alt.*? </li>'
img_src_list = re.findall(ex, page_text, re.S)
new_img_src_list = []
for i in img_src_list:i = i[51:]new_img_src_list.append(i)
print(new_img_src_list)for src in new_img_src_list:image_data = requests.get(src, headers=headers).contentimage_name = src.split('/')[-1]image_path = 'girls_picture' + '/' + image_namewith open(image_path, 'wb') as fp:fp.write(image_data)print(image_name + '下载成功')

多页爬取

我们发现翻页的url变动是有规律的,因此只需for循环更改index后面的数字

import re
import requests
import osif not os.path.exists('./girls_picture'):os.makedirs('girls_picture')url = 'https://www.3gbizhi.com/meinv/mnxz/index_%d.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
for i in range(1, 4):new_url = format(url % i)response = requests.get(new_url, headers=headers)page_text = response.text# 使用聚焦爬虫对页面的信息进行解析ex = '<li class="box_black">.*?<img src="(.*?)" alt.*? </li>'img_src_list = re.findall(ex, page_text, re.S)new_img_src_list = []for i in img_src_list:i = i[51:]new_img_src_list.append(i)print(new_img_src_list)for src in new_img_src_list:image_data = requests.get(src, headers=headers).contentimage_name = src.split('/')[-1]image_path = 'girls_picture' + '/' + image_namewith open(image_path, 'wb') as fp:fp.write(image_data)print(image_name + '下载成功')

bs4

bs4只能被应用在python中

原理:1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
           2.通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取

对象的实例化:1.将本地的html文档中的数据加载到该对象中
                        fp = open('./test.html','r',encoding=' utf-8'
                        soup = BeautifulSoup(fp,'Ixml')

from bs4 import BeautifulSoup# 将本地的html文件加载倒BeautifulSoup对象中
fp = open('sogpu.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
print(soup)

                       2.将互联网上获取的页面源码加载到该对象中
                        page text = response.text
                        soup = BeatifulSoup(page text,'xml')

具体使用

1.soup.tagName:返回html中第一次出现tagName的标签:

print(soup.a)  # 打印a标签'''
<a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信</a>
'''

2.soup.find('tagName'):等同于soup.tagName

print(soup.find('a'))'''
<a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信</a>
'''

属性定位:soup.find('tagName', 属性='')

print(soup.find('div', class_='wrapper'))'''
<div class="wrapper" id="wrap">
<div class="header">
<div class="top-nav">
<ul>
<li class="cur"><span>网页</span></li>
<li><a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信</a></li>
<li><a href="http://zhihu.sogou.com/" id="zhihu" onclick="st(this,'40051200','zhihu')" uigs-id="nav_zhihu">知乎</a></li>
<li><a href="http://pic.sogou.com" id="pic" onclick="st(this,'40030500','pic')" uigs-id="nav_pic">图片</a></li>
<li><a href="https://v.sogou.com/" id="video" onclick="st(this,'40030600','video')" uigs-id="nav_v">视频</a></li>
......
'''

3.soup.find_all('tagName'):返回所有的标签,以列表的形式

print(soup.find_all('a'))'''
[<a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信</a>, <a href="http://zhihu.sogou.com/" id="zhihu" onclick="st(this,'40051200','zhihu')" uigs-id="nav_zhihu">知乎</a>, <a href="http://pic.sogou.com" id="pic" onclick="st(this,'40030500','pic')" uigs-id="nav_pic">图片</a>, <a href="https://v.sogou.com/" id="video" onclick="st(this,'40030600','video')" uigs-id="nav_v">视频</a>, <a href="http://mingyi.sogou.com?fr=common_index_nav" id="mingyi" onclick="st(this,'','myingyi')" uigs-id="nav_mingyi">医疗</a>, <a href="http://hanyu.sogou.com?fr=pcweb_index_nav" id="hanyu" onclick="st(this,'','hanyu')" uigs-id="nav_hanyu">汉语</a>, <a href="http://fanyi.sogou.com?fr=common_index_nav_pc" id="fanyi" onclick="st(this,'','fanyi')" uigs-id="nav_fanyi">翻译</a>, <a href="https://wenwen.sogou.com/?ch=websearch" id="index_more_wenwen" onclick="st(this,'web2ww','wenwen')" uigs-id="nav_wenwen">问问</a>, <a href="http://baike.sogou.com/Home.v" id="index_baike" onclick="st(this,'web2ww','baike')" uigs-id="nav_baike">百科</a>, <a href="http://map.sogou.com" id="map" onclick="st(this,'40031000')" uigs-id="nav_map">地图</a>, <a href="javascript:void(0);" id="more-product">更多<i class="m-arr"></i></a>, <a href="http://zhishi.sogou.com" id="index_more_zhishi" onclick="st(this)" uigs-id="nav_zhishi">知识</a>, <a href="http://as.sogou.com/" id="index_more_appli" onclick="st(this,'40051205')" uigs-id="nav_app">应用</a>, <a href="http://www.sogou.com/docs/more.htm?v=1" onclick="st(this,'40051206')" target="_blank" uigs-id="nav_all">全部</a>, <a href="javascript:void(0)" id="cniil_wza" style="float:left;text-decoration:none;color:#000;opacity:.75;padding-left:8px;margin-right:20px;line-height:14px;position:relative;top:5px">无障碍</a>, <a href="//e.qq.com?from=sougou01" target="_blank" uigs-id="footer_tuiguang">企业推广</a>, <a href="http://www.sogou.com/docs/terms.htm?v=1" target="_blank" uigs-id="footer_disclaimer">免责声明</a>, <a href="http://fankui.help.sogou.com/index.php/web/web/index/type/4" target="_blank" uigs-id="footer_feedback">意见反馈及投诉</a>, <a href="https://www.sogou.com/docs/privacy.htm?v=1" target="_blank" uigs-id="footer_private">隐私政策</a>, <a class="g" href="http://www.12377.cn" target="_blank">网上有害信息举报专区</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP证050897号</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP备11001839号-1</a>, <a class="ba" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000025" target="_blank">京公网安备11000002000025号</a>, <a href="http://pinyin.sogou.com/" target="_blank" uigs-id="mid_pinyin"><i class="i1"></i>搜狗输入法</a>, <a href="http://ie.sogou.com/" target="_blank" uigs-id="mid_liulanqi"><i class="i2"></i>浏览器</a>, <a href="http://123.sogou.com/" target="_blank" uigs-id="mid_daohang"><i class="i3"></i>网址导航</a>, <a class="g" href="//e.qq.com?from=sougou01" target="_blank">企业推广</a>, <a class="g" href="http://www.sogou.com/docs/terms.htm?v=1" target="_blank">免责声明</a>, <a class="g" href="http://fankui.help.sogou.com/index.php/web/web/index/type/4" target="_blank">意见反馈及投诉</a>, <a class="g" href="https://www.sogou.com/docs/privacy.htm?v=1" target="_blank" uigs-id="footer_private">隐私政策</a>, <a class="g" href="http://www.12377.cn" target="_blank">网上有害信息举报专区</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP证050897号</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP备11001839号-1</a>, <a class="ba" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000025" target="_blank">京公网安备11000002000025号</a>, <a href="javascript:void(0);" id="miniQRcode"></a>, <a class="back-top" href="javascript:void(0);" id="back-top"></a>]
'''

4.soup.select('某种选择器(id,class,标签......)'):返回一个列表

print(soup.select('a'))'''
[<a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信</a>, <a href="http://zhihu.sogou.com/" id="zhihu" onclick="st(this,'40051200','zhihu')" uigs-id="nav_zhihu">知乎</a>, <a href="http://pic.sogou.com" id="pic" onclick="st(this,'40030500','pic')" uigs-id="nav_pic">图片</a>, <a href="https://v.sogou.com/" id="video" onclick="st(this,'40030600','video')" uigs-id="nav_v">视频</a>, <a href="http://mingyi.sogou.com?fr=common_index_nav" id="mingyi" onclick="st(this,'','myingyi')" uigs-id="nav_mingyi">医疗</a>, <a href="http://hanyu.sogou.com?fr=pcweb_index_nav" id="hanyu" onclick="st(this,'','hanyu')" uigs-id="nav_hanyu">汉语</a>, <a href="http://fanyi.sogou.com?fr=common_index_nav_pc" id="fanyi" onclick="st(this,'','fanyi')" uigs-id="nav_fanyi">翻译</a>, <a href="https://wenwen.sogou.com/?ch=websearch" id="index_more_wenwen" onclick="st(this,'web2ww','wenwen')" uigs-id="nav_wenwen">问问</a>, <a href="http://baike.sogou.com/Home.v" id="index_baike" onclick="st(this,'web2ww','baike')" uigs-id="nav_baike">百科</a>, <a href="http://map.sogou.com" id="map" onclick="st(this,'40031000')" uigs-id="nav_map">地图</a>, <a href="javascript:void(0);" id="more-product">更多<i class="m-arr"></i></a>, <a href="http://zhishi.sogou.com" id="index_more_zhishi" onclick="st(this)" uigs-id="nav_zhishi">知识</a>, <a href="http://as.sogou.com/" id="index_more_appli" onclick="st(this,'40051205')" uigs-id="nav_app">应用</a>, <a href="http://www.sogou.com/docs/more.htm?v=1" onclick="st(this,'40051206')" target="_blank" uigs-id="nav_all">全部</a>, <a href="javascript:void(0)" id="cniil_wza" style="float:left;text-decoration:none;color:#000;opacity:.75;padding-left:8px;margin-right:20px;line-height:14px;position:relative;top:5px">无障碍</a>, <a href="//e.qq.com?from=sougou01" target="_blank" uigs-id="footer_tuiguang">企业推广</a>, <a href="http://www.sogou.com/docs/terms.htm?v=1" target="_blank" uigs-id="footer_disclaimer">免责声明</a>, <a href="http://fankui.help.sogou.com/index.php/web/web/index/type/4" target="_blank" uigs-id="footer_feedback">意见反馈及投诉</a>, <a href="https://www.sogou.com/docs/privacy.htm?v=1" target="_blank" uigs-id="footer_private">隐私政策</a>, <a class="g" href="http://www.12377.cn" target="_blank">网上有害信息举报专区</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP证050897号</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP备11001839号-1</a>, <a class="ba" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000025" target="_blank">京公网安备11000002000025号</a>, <a href="http://pinyin.sogou.com/" target="_blank" uigs-id="mid_pinyin"><i class="i1"></i>搜狗输入法</a>, <a href="http://ie.sogou.com/" target="_blank" uigs-id="mid_liulanqi"><i class="i2"></i>浏览器</a>, <a href="http://123.sogou.com/" target="_blank" uigs-id="mid_daohang"><i class="i3"></i>网址导航</a>, <a class="g" href="//e.qq.com?from=sougou01" target="_blank">企业推广</a>, <a class="g" href="http://www.sogou.com/docs/terms.htm?v=1" target="_blank">免责声明</a>, <a class="g" href="http://fankui.help.sogou.com/index.php/web/web/index/type/4" target="_blank">意见反馈及投诉</a>, <a class="g" href="https://www.sogou.com/docs/privacy.htm?v=1" target="_blank" uigs-id="footer_private">隐私政策</a>, <a class="g" href="http://www.12377.cn" target="_blank">网上有害信息举报专区</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP证050897号</a>, <a class="g" href="https://beian.miit.gov.cn/" target="_blank">京ICP备11001839号-1</a>, <a class="ba" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000025" target="_blank">京公网安备11000002000025号</a>, <a href="javascript:void(0);" id="miniQRcode"></a>, <a class="back-top" href="javascript:void(0);" id="back-top"></a>]
'''
print(soup.select('.user-box'))'''
[<div class="user-box">
<div class="local-weather" id="local-weather">
<div class="wea-box" id="cur-weather" style="display:none"></div>
<div class="pos-more" id="detail-weather" style="top:40px;left:-110px"></div>
</div>
<span class="line" id="user-box-line" style="display:none"></span> <a href="javascript:void(0)" id="cniil_wza" style="float:left;text-decoration:none;color:#000;opacity:.75;padding-left:8px;margin-right:20px;line-height:14px;position:relative;top:5px">无障碍</a>
</div>]
'''

5.soup.select('... > ... > ...'):层级选择

print(soup.select('.wrapper > .header > .top-nav > ul > li > a'))'''
[<a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信</a>, <a href="http://zhihu.sogou.com/" id="zhihu" onclick="st(this,'40051200','zhihu')" uigs-id="nav_zhihu">知乎</a>, <a href="http://pic.sogou.com" id="pic" onclick="st(this,'40030500','pic')" uigs-id="nav_pic">图片</a>, <a href="https://v.sogou.com/" id="video" onclick="st(this,'40030600','video')" uigs-id="nav_v">视频</a>, <a href="http://mingyi.sogou.com?fr=common_index_nav" id="mingyi" onclick="st(this,'','myingyi')" uigs-id="nav_mingyi">医疗</a>, <a href="http://hanyu.sogou.com?fr=pcweb_index_nav" id="hanyu" onclick="st(this,'','hanyu')" uigs-id="nav_hanyu">汉语</a>, <a href="http://fanyi.sogou.com?fr=common_index_nav_pc" id="fanyi" onclick="st(this,'','fanyi')" uigs-id="nav_fanyi">翻译</a>, <a href="https://wenwen.sogou.com/?ch=websearch" id="index_more_wenwen" onclick="st(this,'web2ww','wenwen')" uigs-id="nav_wenwen">问问</a>, <a href="http://baike.sogou.com/Home.v" id="index_baike" onclick="st(this,'web2ww','baike')" uigs-id="nav_baike">百科</a>, <a href="http://map.sogou.com" id="map" onclick="st(this,'40031000')" uigs-id="nav_map">地图</a>, <a href="javascript:void(0);" id="more-product">更多<i class="m-arr"></i></a>]
'''

空格可以表示多层级,例如ul下的a标签全在li中,这时可以

print(soup.select('.wrapper > .header > .top-nav > ul a'))'''
[<a href="http://weixin.sogou.com/" id="weixinch" onclick="st(this,'73141200','weixin')" uigs-id="nav_weixin">微信</a>, <a href="http://zhihu.sogou.com/" id="zhihu" onclick="st(this,'40051200','zhihu')" uigs-id="nav_zhihu">知乎</a>, <a href="http://pic.sogou.com" id="pic" onclick="st(this,'40030500','pic')" uigs-id="nav_pic">图片</a>, <a href="https://v.sogou.com/" id="video" onclick="st(this,'40030600','video')" uigs-id="nav_v">视频</a>, <a href="http://mingyi.sogou.com?fr=common_index_nav" id="mingyi" onclick="st(this,'','myingyi')" uigs-id="nav_mingyi">医疗</a>, <a href="http://hanyu.sogou.com?fr=pcweb_index_nav" id="hanyu" onclick="st(this,'','hanyu')" uigs-id="nav_hanyu">汉语</a>, <a href="http://fanyi.sogou.com?fr=common_index_nav_pc" id="fanyi" onclick="st(this,'','fanyi')" uigs-id="nav_fanyi">翻译</a>, <a href="https://wenwen.sogou.com/?ch=websearch" id="index_more_wenwen" onclick="st(this,'web2ww','wenwen')" uigs-id="nav_wenwen">问问</a>, <a href="http://baike.sogou.com/Home.v" id="index_baike" onclick="st(this,'web2ww','baike')" uigs-id="nav_baike">百科</a>, <a href="http://map.sogou.com" id="map" onclick="st(this,'40031000')" uigs-id="nav_map">地图</a>, <a href="javascript:void(0);" id="more-product">更多<i class="m-arr"></i></a>]
'''

6. .text/.string/.get_text:text和get_text是获取标签下所有的文本内容,可以跨层级

                                        string只能获取本标签中的文本内容

print(soup.select('.header')[0].text)'''网页
微信
知乎
图片
视频
医疗
汉语
翻译
问问
百科
地图更多
知识应用全部
......
'''print(soup.select('.header')[0].string)'''
None
'''

7.['属性']:获取标签中的属性内容

print(soup.select('.top-nav > ul > li > a')[0]['href'])'''
http://weixin.sogou.com/
'''

bs4实战

爬取三国演义中所有的章节标题和章节内容

《三国演义》全集在线阅读_史书典籍_诗词名句网 (shicimingju.com)

由于是获取所有内容,因此不用一个个去p标签里面循环提取文字,而是之间用text或get_text

import requests
from bs4 import BeautifulSoupurl = 'https://www.shicimingju.com/book/sanguoyanyi.html'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}page_text = requests.get(url, headers=headers).text
soup = BeautifulSoup(page_text, 'lxml')
li_list = soup.select('.book-mulu > ul > li')
fp = open('sanguoyanyi.txt', 'w', encoding='utf-8')
for li in li_list:title = li.a.stringdetail_url = 'https://www.shicimingju.com/' + li.a['href']# 对详情页发起请求detail_page_text = requests.get(detail_url, headers=headers).textdetail_soup = BeautifulSoup(detail_page_text, 'lxml')div_tag = detail_soup.find('div', class_='chapter_content')content = div_tag.textfp.write(title + ': ' + content + '\n')print(title + '爬取成功\n')

报错是因为现在这个网站对文字加密了,找不到chapter_content和p的内容,但代码是没问题的

xpath

最常用、编写最高效、最通用的数据解析方式

原理:1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
           2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获

如何实例化一个etree对象:from Lxml import etree
        - 1.将本地的html文档中的源码数据加载到etree对象中:

                   etree.parse(filePath)
        - 2.可以将从互联网上获取的源码数据加载到该对象中:

                   etree.HTML('page_text' )

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('/html/head/meta')
print(trs)'''
[<Element meta at 0x25a08a8d600>, <Element meta at 0x25a08a8d5c0>, <Element meta at 0x25a08a8d800>, <Element meta at 0x25a08a8d900>, <Element meta at 0x25a08a8d8c0>, <Element meta at 0x25a08a8d9c0>, <Element meta at 0x25a08a8da00>]
'''

返回一个列表,里面放着Element类型的对象;/表示从根节点开始定位,表示一个层级

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('/html//meta')
print(trs)'''
[<Element meta at 0x25a08a8d600>, <Element meta at 0x25a08a8d5c0>, <Element meta at 0x25a08a8d800>, <Element meta at 0x25a08a8d900>, <Element meta at 0x25a08a8d8c0>, <Element meta at 0x25a08a8d9c0>, <Element meta at 0x25a08a8da00>]
'''

//表示多个层级,类似于bs4中的空格

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('//meta')
print(trs)'''
[<Element meta at 0x249b03e0500>, <Element meta at 0x249b03e0600>, <Element meta at 0x249b03e05c0>, <Element meta at 0x249b03e0480>, <Element meta at 0x249b03e06c0>, <Element meta at 0x249b03e0740>, <Element meta at 0x249b03e0780>]
'''

//也表示从任意层级开始匹配,可以获取全部的标签

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('//div[@class="content"]')
print(trs)'''
[<Element div at 0x1c44c380640>]
'''

[@...]属性定位

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('//div[@class="top-nav"]/ul/li')
print(trs)'''
[<Element li at 0x1852260ac00>, <Element li at 0x1852260abc0>, <Element li at 0x1852260aa80>, <Element li at 0x1852260acc0>, <Element li at 0x1852260ad00>, <Element li at 0x1852260ad80>, <Element li at 0x1852260adc0>, <Element li at 0x1852260ae00>, <Element li at 0x1852260ae40>, <Element li at 0x1852260ad40>, <Element li at 0x1852260ae80>, <Element li at 0x1852260aec0>]
'''trs = tree.xpath('//div[@class="top-nav"]/ul/li[1]')
print(trs)'''
[<Element li at 0x1852260ac00>]
'''

[num]索引定位,num不是下标,而是索引偏移量,因此1就是第1个

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('//div[@class="top-nav"]/ul/li[2]/a/text()')
print(trs)'''
['微信']
'''

/text():只取本标签中的文字内容

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('//div[@class="top-nav"]//text()')
print(trs)'''
['\r\n            ', '\r\n                ', '网页', '\r\n                ', '微信', '\r\n                ', '知乎', '\r\n                ', '图片', '\r\n                ', '视频', '\r\n                ', '医疗', '\r\n                ', '汉语', '\r\n                ', '翻译', '\r\n                ', '问问', '\r\n                ', '百科', '\r\n                ', '地图', '\r\n                ', '\r\n                ', '更多', '\r\n                    ', '知识', '应用', '全部', '\r\n                ', '\r\n            ', '\r\n        ']
'''

//text():可以取到非直系的文字内容

from lxml import etree# 实例化一个etree对象
tree = etree.parse('sogou.html', etree.HTMLParser())
# 层级关系,由外到内
trs = tree.xpath('//div[@class="top-nav"]//@href')
print(trs)'''
['http://weixin.sogou.com/', 'http://zhihu.sogou.com/', 'http://pic.sogou.com', 'https://v.sogou.com/', 'http://mingyi.sogou.com?fr=common_index_nav', 'http://hanyu.sogou.com?fr=pcweb_index_nav', 'http://fanyi.sogou.com?fr=common_index_nav_pc', 'https://wenwen.sogou.com/?ch=websearch', 'http://baike.sogou.com/Home.v', 'http://map.sogou.com', 'javascript:void(0);', 'http://zhishi.sogou.com', 'http://as.sogou.com/', 'http://www.sogou.com/docs/more.htm?v=1']
'''

/@属性:获取标签中属性的值

58二手房房源

爬取并解析出二手房房源的名称

北京二手房网,北京房产网,北京二手房买卖出售交易信息-北京58同城

import requests
from lxml import etreeurl = 'https://bj.58.com/ershoufang'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
page_text = requests.get(url, headers=headers).text
tree = etree.HTML(page_text)
trs = tree.xpath('//div[@class="property-content-title"]/h3/@title')fp = open('./2hand_house.txt', 'w', encoding='utf-8')
for i in trs:fp.write(i + '\n')

未完待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/245093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年 全新 HTTP 客户端 你用了?

我们平时开发项目的时候&#xff0c;经常会需要远程调用下其他服务提供的接口&#xff0c;于是我们会使用一些 HTTP 工具类比如 Hutool 提供的 HttpUtil。SpringBoot 3.0 出了一个Http Interface的新特性&#xff0c;它允许我们使用声明式服务调用的方式来调用远程接口&#xf…

重磅!Salesforce推出UE+无限版餐套,企业如何选择?

孤立的应用程序和脱节的技术堆栈是所有企业的噩梦。目前&#xff0c;市场上产品和服务种类繁多&#xff0c;无缝集成和清晰、直接的购买流程可以决定整体体验的成败。 Salesforce云以及其他应用程序在过去几年中经历了巨大增长。随着越来越多的功能被捆绑在一起&#xff0c;Un…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

Tarjan 算法(超详细!!)

推荐在 cnblogs 上阅读 Tarjan 算法 前言 说来惭愧&#xff0c;这个模板仅是绿的算法至今我才学会。 我还记得去年 CSP2023 坐大巴路上拿着书背 Tarjan 的模板。虽然那年没有考连通分量类似的题目。 现在做题遇到了 Tarjan&#xff0c;那么&#xff0c;重学&#xff0c;开…

“趣味夕阳,乐享生活”小组活动(第二节)

立冬以来&#xff0c;天气日渐寒冷&#xff0c;气温变化较大&#xff0c;各种传染病多发&#xff0c;为进一步增强老年人冬季预防传染病保健意识及科学合理健康的生活方式。近日&#xff0c;1月22日&#xff0c;南阳市人人社工灌涨站开展了“趣味夕阳&#xff0c;乐享生活”小组…

【C++ | 数据结构】从哈希的概念 到封装C++STL中的unordered系列容器

文章目录 一、unordered系列容器的底层结构 - 哈希1. 哈希概念2. 哈希冲突 二、解决哈希冲突方法一&#xff1a;合理设计哈希函数&#x1f6a9;哈希函数设计原则&#x1f6a9;常见哈希函数 方法二&#xff1a;开闭散列&#x1f6a9;闭散列线性探测法&#xff08;实现&#xff0…

gradle打包分离依赖jar

正常打包的jar是包含项目所依赖的jar包资源&#xff0c;而且大多数场景下的依赖资源是不会频繁的变更的&#xff0c;所以实际把项目自身jar和其所依赖的资源分离可以实现jar包瘦身&#xff0c;减小上传的jar包总大小&#xff0c;能实现加速部署的效果 一 原本结构 二 配置buil…

第04章_IDEA的安装与使用(下)(IDEA断点调试,IDEA常用插件)

文章目录 第04章_IDEA的安装与使用&#xff08;下&#xff09;8. 快捷键的使用8.1 常用快捷键8.2 查看快捷键1、已知快捷键操作名&#xff0c;未知快捷键2、已知快捷键&#xff0c;不知道对应的操作名 8.3 自定义快捷键8.4 使用其它平台快捷键 9. IDEA断点调试(Debug)9.1 为什么…

<网络安全>《2 国内主要企业网络安全公司概览(二)》

4 北京天融信科技有限公司(简称天融信) 信息内容LOGO成立日期创始于1995年总部北京市海淀区上地东路1号院3号楼北侧301室背景民营企业是否上市天融信[002212]A股市值99亿主要产品网络安全大数据云服务员工规模6000多人简介天融信科技集团&#xff08;证券代码&#xff1a;0022…

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新&#xff1a;正常刷新网页&#xff0c;网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新&#xff1a;忽略缓存刷新&#xff0c;重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据

freeRTOS总结(八)任务相关API函数

1&#xff0c; FreeRTOS任务相关API函数介绍&#xff08;熟悉&#xff09; UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) 获取任务优先级函数 此函数用于获取指定任务的任务优先级&#xff0c;使用该函数需将宏 INCLUDE_uxTaskPriorityGet 置 1 void vTask…

用于垃圾回收的运行时配置选项

反馈 本文内容 指定配置的方法垃圾回收的风格管理资源使用情况大型页面 显示另外 4 个 此页面包含有关 .NET 运行时垃圾回收器 (GC) 设置的信息。 如果你要尝试让正在运行的应用达到最佳性能&#xff0c;请考虑使用这些设置。 然而&#xff0c;在特定情况下&#xff0c;默认…

【动态规划】C++ 算法458:可怜的小猪

作者推荐 视频算法专题 涉及知识点 动态规划 数学 力扣458:可怜的小猪 有 buckets 桶液体&#xff0c;其中 正好有一桶 含有毒药&#xff0c;其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药&#xff0c;你可以喂一些猪喝&#xff0c;通过观察猪是否…

精通 Spring REST API:最佳实践

概述 随着数字时代的推进&#xff0c;基于Web的程序已经成为构建交互式应用的关键。客户端与服务器之间的沟通频繁依赖于通过 APIs 获取的网络服务。 使用开源框架Spring&#xff0c;开发者可以有效率地搭建Web服务。本篇文章旨在展示如何利用Spring来构筑一个REST风格的Web服…

基于Java+SpringBoot+vue+element疫情物资捐赠分配系统设计和实现

基于JavaSpringBootvueelement疫情物资捐赠分配系统设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种…

【字符串】【C++算法】828.统计子串中的唯一字符

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 子数组&#xff08;串&#xff09; 字符串 LeetCoce828.统计子串中的唯一字符 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符&#xff0c;并返回唯一字符的个数。 例…

【pyqt6】用pyqt做一个点菜小程序

用pyqt做一个点菜小程序 前言1.pyqt62. 功能介绍3.程序实现 前言 在本文中&#xff0c;我们将使用 PyQt6&#xff08;Python的GUI库&#xff09;创建一个简单的点菜小程序。该程序允许用户从菜单中选择菜品&#xff0c;将其添加到订单中&#xff0c;并通过点击“下单”按钮查看…

3.postman动态参数、文件上传及断言

一、postman内置动态参数以及自定义的动态参数 postman内置动态参数&#xff1a; {{$timestamp}} 生成当前时间的时间戳 {{$randomint}} 生成0-1000之间的随机数 {{$guid}} 生成随机guid字符串 自定义动态参数&#xff1a; 在请求中pre-req页面下 //手动的获得时间戳 var…

关于鸿蒙系统开源和技术细节的一些探讨

1月18日在深圳举办了“鸿蒙生态千帆启航仪式”&#xff0c;这也是华为鸿蒙开启生态进阶的信号。在政策的叠加下&#xff0c;鸿蒙未来必定是势不可挡的。我们这些程序员也得与时俱进&#xff0c;熟悉鸿蒙的技术和细节&#xff0c;别在经济寒冬里被淘汰了。 官方称 Harmony OS N…

1.24号c++

C绪论 c是c语言的扩充&#xff0c;C包含了C的所有属性&#xff0c;换一句话说&#xff0c;C语言在C中都合法。 C语言编程思想&#xff1a;面向过程 c编程思想&#xff1a;面向对象 可以说在C中一切皆对象。 c的三大属性&#xff1a;封装&#xff0c;继承&#xff0c;多态。…