bs4解析
bs4:

环境安装:
lxml
bs4

bs4编码流程:
1.实例化一个bs4对象,且将页面源码数据加载到该对象中
2.bs相关的方法或者属性实现标签定位
3.取文本或者取属性

bs的属性和方法

soup.tagName
tagName.string/text/get_text()
tagName[attrName]
find(tagName,attrName='value')
select('层级选择器') > 空格
  • 环境的安装:
    - pip install lxml
    - pip install bs4
  • bs4解析原理:
    • 实例化一个bs对象,且将页面源码数据加载到该对象中。
    • 使用bs对象中封装好的属性或者方法实现标签定位
    • 将定位到的标签中的文本(属性)取出
      用法:

      import requests
      from bs4 import BeautifulSoup
      headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
      }

      将本地的一个test.html文档中的源码数据加载到bs对象中

      soup = BeautifulSoup(open('./test.html','r',encoding='utf-8'),'lxml')
      soup.p #定位到源码中第一个p标签
      soup.a['href']  #取属性
      soup.img['src']

      取文本 返回字符串

      soup.p.get_text()

      取标签

      soup.div
      #
      soup.div.string #string直接获取标签的直系文本内容
      soup.div.text # 取文本
      soup.ul.text

      查找 只查找第一个元素

      soup.find('li') #soup.li

      属性定位

      soup.find('div',class_='song')

      查找所有的 div标签

      soup.find_all('div')[0]

      通过选择器查找 返回列表

      soup.select('#feng')

      获取 内容

      soup.select('ul > li > a')[3].string

bs4 爬取某某诗词网

#需求:某某诗词网中的三国演义小说进行爬取:http://www.*****.com/book/sanguoyanyi.html
import requests
from bs4 import BeautifulSoup
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
url = 'http://www.****.com/book/sanguoyanyi.html'
page_text = requests.get(url=url,headers=headers).text

#数据解析
soup = BeautifulSoup(page_text,'lxml')
#解析出章节和详情页的url
li_list = soup.select('.book-mulu > ul > li')
fp = open('./三国演义.txt','w',encoding='utf-8')
for li in li_list:
    title = li.a.string
    detail_url = 'http://www.**********.com'+li.a['href']
    #获取了详情页的页面源码数据
    detail_page_text = requests.get(url=detail_url,headers=headers).text
    soup = BeautifulSoup(detail_page_text,'lxml')
    #解析出章节对应的内容
    content = soup.find('div',class_='chapter_content').text
    fp.write(title+'\n'+content)
    print(title,'下载完毕')

fp.close()

标签

发表评论