#提供的用于数据分析的方法和属性: # 1、soup.tagName:返回的是文档中第一次出现的tagName对应的标签 # 2、soup.find():find('tagName')等同于soup.tagName # 属性定位: print(soup.find('meta',description_='keywords')) # 3、soup.find_all(‘tagName’)返回符合条件的所有标签 返回的是列表 # 4、soup.select(id、类、标签选择器)返回的是列表 # print(soup.select('.tang > ul > li > a'))[0] # # 层级标签 bs4不支持使用索引 因此可以在生成列表后进行索引 >标识一个层级 space(空格)标识多个层级 # 获取标签之间的文本数据 # soup.text/get_text()/string # soup.text/soup.get_text():可以获得标签的所有文本数据 # soup.string只能获取直系标签下的文本数据 # print(soup.find('div', class_="chose_city").text) # 获取标签中属性值 # soup.a['属性名称'] # print(soup.select('.chose_city a')[0]['href'])
# 需求:爬取三国演义所有章节的标题和内容 from bs4 import BeautifulSoup import requests if __name__=='__main__': # 首先对首页的页面进行提取 url='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/72.0.3626.119 Safari/53'} response=requests.get(url=url,headers=headers).text # 在首页中解析出章节的标题和内容 # 实例化beautifulsoup对象 将页面原码数据加载到对象中 soup=BeautifulSoup(response,'lxml') # 解析章节标题和章节内容 li_list=soup.select('.book-mulu>ul>li') fp=open('./sanguo.html','w',encoding='utf-8') for li in li_list: title=li.a.string detail_url='https://www.shicimingju.com/book/sanguoyanyi.html'+li.a['href'] # 对详情页发起请求 解析出章节内容 detail_response=requests.get(url=detail_url,headers=headers) detail_response_text=detail_response.text detail_soup=BeautifulSoup(detail_response_text,'lxml') content=detail_soup.find('div',class_='chapter_content').text fp.write(title+':'+content+'/n') print('over')
# xpath('xpath表达式’)最重要 # /:表示的是从根节点开始定位,表示的是一个层级 print(tree.xpath('/html/head/title')) #//:表示的是多个层级 print(tree.xpath('/html//title')) # //:可以表示从任意位置进行定位 print(tree.xpath('//title')) 返回的是一个列表 # 属性定位 r=tree.xpath('//div[@] tag[@attrName='attrValue'] 属性值的写法 中括号【】 @后加属性的定位 # 索引定位:r=tree.xpath('//div[@]/p[3]') 索引是从1开始 # 如何取文本 # 1、/text():获取的是标签中直系的文本内容 r=tree.xpath('//div[@]/p[3]/text') # 2、//text():标签中非直系的文本内容(所有文本) r=tree.xpath('//div[@]/p[3]//text') # 如何取属性 # 1、/@attrName image/@src # import requests # from lxml import etree # if __name__=='__main__': # tree=etree.parse('./restaurant.html') # print(tree.xpath('//title')) # r=tree.xpath('//div[@]/p[3]//text') # # # 需求:爬取58二手房中的房源信息 # import requests # from lxml import etree # if __name__=='__main__': # url='https://jl.58.com/ershoufang/' # # 先获取页面原码数据 # headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/53'} # response=requests.get(url=url,headers=headers) # response_text=response.text # # 进行数据解析 # tree=etree.HTML(response_text) # # 存储的就是li标签的数据信息 # li_list=tree.xpath('//ul[@]/li') # fp=open('58.txt','w',encoding='utf-8') # for li in li_list: # title= li.xpath('./div[2]/h3/a/text()')[0] # # .表示当前的页面数据 # # fp.write(title+'\n') # print(title) # import requests from lxml import etree import os if __name__=='__main__': url='http://pic.netbian.com/4kmeinv/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/53'} response=requests.get(url=url,headers=headers) # 手动设定编码问题 解决爬虫的乱码问题 可能好用 也可能不好用 response.encoding='utf-8' response_text=response.text tree=etree.HTML(response_text) # 数据解析:src的属性值 alt属性值 li_list=tree.xpath('//div[@]//li') if not os.path.exists('./piclibs'): os.mkdir('./piclibs') for li in li_list: image_src='http://pic.netbian.com'+li.xpath('./a/img/@src')[0] image_name=li.xpath('./a/img/@alt')[0]+'.jpg' # 通用处理中文乱码的解决方案 # image_name=image_name.encode('iso-8859-1').decode('gbk') print(image_name,image_src) # 请求图片进行持久化存储 image_response=requests.get(url=image_src,headers=headers).content image_path='./piclibs' with open('image_path','wb') as fp: fp.write(image_response) print('over')
from lxml import etree import requests # 一次性将热门城市和普通城市都解析出来 if __name__=='__main__': url='https://www.aqistudy.cn/historydata/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/53'} response=requests.get(url=url,headers=headers).text tree=etree.HTML(response) # 解析到热门城市和所有城市对应的a标签 # div/ul/li/a 热门城市a标签的层级关系 # div/ul/div[2]/li/a 全部城市a标签的层级关系 all_list=tree.xpath('//div/ul/li/a |//div/ul/div[2]/li/a') all_name=[] for li in all_list: all_list_name=li.xpath('./text()')[0] all_name.append(all_list_name) print(all_name,len(all_name))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)