• 爬虫库之BeautifulSoup学习(五)


    css选择器:

    我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list

    1)通过标签名查找

    print soup.select('title')

    #[<title>The Dormouse's story</title>]

    print soup.select('a')

    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

    2)通过类名查找

    print soup.select('.sister')

    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

    3)通过id名查找

    print soup.select('#link1')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

    4)组合查找

    组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开

    print soup.select('p #link1')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

    直接子标签查找

    print soup.select("head>title")

    #[<title>The Dormouse's story</title>]

    5、属性查找

    查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。


    print soup.select('a[class="sister"]')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

    print soup.select('a[class="sister"]')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

    print soup.select('a[href="http://example.com/elsie"]')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

    print soup.select('a[href="http://example.com/elsie"]')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
    同样,属性仍然可以与上述查找方式组合,不在同一节点的空格隔开,同一节点的不加空格


    print soup.select('p a[href="http://example.com/elsie"]')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]

    print soup.select('p a[href="http://example.com/elsie"]')
    #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]


    以上的 select 方法返回的结果都是列表形式,可以遍历形式输出,然后用 get_text() 方法来获取它的内容。


    soup = BeautifulSoup(html, 'lxml')
    print type(soup.select('title'))
    print soup.select('title')[0].get_text()

    for title in soup.select('title'):
    print title.get_text()

    soup = BeautifulSoup(html, 'lxml')
    print type(soup.select('title'))
    print soup.select('title')[0].get_text()

    for title in soup.select('title'):
    print title.get_text()


    好,这就是另一种与 find_all 方法有异曲同工之妙的查找方法,是不是感觉很方便?

    【实战练习】:

    爬取kugou top 500排名、歌手、歌曲、时间

    #-*-coding:utf-8-*-

    import requests
    from bs4 import BeautifulSoup
    import time

    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
    Chrome/66.0.3359.181 Safari/537.36 XiaoBai/10.0.1708.542 (XBCEF)'}

    def get_info(url):
      wb_data = requests.get(url,headers=headers)
      soup = BeautifulSoup(wb_data.text,'lxml')

      ranks = soup.select('span.pc_temp_num')                                  #获取排名情况
      titles = soup.select('div.pc_temp_songlist > ul > li > a')              #获取歌曲标题
      times = soup.select('span.pc_temp_tips_r > span')                   #获取歌曲时间

      for rank,title,time in zip(ranks,titles,times):
        data = {
        'rank':rank.get_text().strip(),
        'singer':title.get_text().split('-')[0],
        'song':title.get_text().split('-')[-1],
        'time':time.get_text().strip()
        }
        print (data)

    if __name__ == '__main__':
      urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html'.format(number) for number in range(1,24)]           #构造多页url
      for url in urls:
        get_info(url)                                                                  #循环调用get_info函数
      time.sleep(1)


  • 相关阅读:
    Python 正则表达式(分组)
    django 笔记
    Java代理和动态代理机制分析和应用
    Chrome浏览器如何调试移动端网页信息
    【数据分析】Excle中安装数据分析工具
    【BigData】Java基础_socket编程中使用多线程
    【BigData】Java基础_多线程
    【BigData】Java基础_socket编程
    财务报表之利润表
    资产负债表的会计恒等式
  • 原文地址:https://www.cnblogs.com/yu2000/p/6861620.html
Copyright © 2020-2023  润新知