1、实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
2、通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取
- pip install bs4
-
- pip install lxml
-
- from bs4 import BeautifulSoup
-
对象的实例化:
1.将本地的html文档中的数据加载到该对象中
- from bs4 import BeautifulSoup
-
- if __name__=="__main__":
- #将本地的html文档中的数据加载到该对象呢中
- fp=open('./01.html','r',encoding='utf-8')
- soup=BeautifulSoup(fp,'lxml')
- print(soup)
-
2.将互联网上获取的页面源码加载到该对象中
- page_text =response.text
- soup=BeatifulSoup( page_text, 'lxml ')
-
提供的用于数据解析的方法和属性:
1、 soup.tagName:返回的是文档中第一次出现的tagName对应的标签
- soup.a #suop.tagName :suop.后面跟随的是一个标签名
- print(soup.a) #suop.tagName返回的是html中第一次出现tagName标签
-
- '''
- 输出:
- <a href="/article/124910652" target="_blank">
- <img alt="糗事#124910652" class="illustration" height="auto" src="//pic.qiushibaike.com/system/pictures/12491/124910652/medium/JH2JHAXTS44IPI2Q.jpg" width="100%"/>
- </a>
-
- '''
-
2、soup.find():
(1)find( ‘tagName’):等同于soup.div
- soup.find('div') #等同于soup.div
-
(2)属性定位:
soup- find (‘div’ ,classr-‘song’)
- soup.find('div',class_='song') #class_加下划线表示一个参数,定位
-
3、soup.find_all(‘tagName’):返回符合要求的所有标签(列表)
- soup.find_all('a')
-
4、select:
(1)、select(‘某种选择器(id,class,标签…选择器)’),返回的是一个列表。
- suop.select('.tang') #html中的class=tang的
-
(2)层级选择器
- #1、> 表示的是一个层级
- soup.select('.tang > ul > li > a') #返回的是列表
- soup.select('.tang > ul > li > a')[0]#返回的是列表
-
- #2、空格表示的是多个层级
- soup.select('.tang > ul a')[0]#返回的是列表
-
5、获取标签之间的文本数据:
soup.a.text / string / get_text()
text/get_text():可以获取某一个标签中所有的文本内容
string:只可以获取该标签下面直系的文本内容
- soup.select('.tang > ul a')[0].text
- soup.select('.tang > ul a')[0].string
- soup.select('.tang > ul a')[0].get_text()
-
6、获取标签中属性值:
- soup.a[ 'href' ]
-
- import requests
- from bs4 import BeautifulSoup
-
- #爬取三国演义的所有章节
-
- if __name__=="__main__":
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
- }
-
- #对首页数据进行爬虫
- url='https://www.xbiquge.la/75/75639/'
-
- page=requests.get(url=url,headers=headers).content
-
-
- #在首页中解析出张杰的标题和详情页的url
- #1.实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中
- soup=BeautifulSoup(page,'lxml')
-
- #解析章节标题和详情页的url
- li_list=soup.select('.box_con>div > dl > dd')
-
- print(li_list)
- fp=open('xiaoshuo.txt','w',encoding='utf-8')
- for li in li_list:
- title=li.a.string
- print(title)
- detail_url='https://www.xbiquge.la'+li.a['href']
-
- #对详情页发起请求,解析出章节的内容
- detail_page_text=requests.get(url=detail_url,headers=headers).content
- #print(detail_page_text)
- #解析出详情页中的相关章节
- detail_suop=BeautifulSoup(detail_page_text,'lxml')
- div_tag=detail_suop.find('div',class_="content_read")
- #解析到章节的内容
- content=div_tag.text #div下面的所有内容
- fp.write(title+':'+content+'\n')
- print(title+'爬去成功!!!')