前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫篇| 网页解析库xpath和BeautifulSoup(五)

爬虫篇| 网页解析库xpath和BeautifulSoup(五)

作者头像
润森
发布2019-08-29 10:57:53
2.8K0
发布2019-08-29 10:57:53
举报
文章被收录于专栏:毛利学Python

BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间。

BeautifulSoup安装

代码语言:javascript
复制
pip3 install beautifulsoup4

BeautifulSoup的使用

一图看懂BeautifulSoup的使用

节点对象

  • Tag

tag对象可以说是BeautifulSoup中最为重要的对象,通过BeautifulSoup来提取数据基本都围绕着这个对象来进行操作。

每一个tag对象都有name属性,为标签的名字。

  • NavigableString

NavigableString的意思是可以遍历的字符串,一般被标签包裹在其中的的文本就是NavigableString格式。

在这里插入图片描述

  • BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag

  • Comment

Comment指的是在网页中的注释以及特殊字符串

如何使用

  • 获取标签
代码语言:javascript
复制
title = soup.head.title(获取head标签下面的第一个title标签)
  • 获取属性
代码语言:javascript
复制
title = soup.p['title']
  • 获取文本内容
代码语言:javascript
复制
# string方法只能获取p标签的内容
string = suop.p.string
#通过get_text()方法我们可以获取p下所有的文本内容。
text = soup.p.get_text()
  • 获取节点(tpye:generator) 通过contents可以获取某个节点所有的子节点,包括里面的NavigableString对象。获取的子节点是列表格式。而通过children同样的是获取某个节点的所有子节点,但是返回的是一个迭代器,这种方式会比列表格式更加的节省内存 contentschildren获取的是某个节点的直接子节点,而无法获得子孙节点。通过descendants可以获得所有子孙节点,返回的结果跟children一样,需要迭代或者转类型使用。 有时我们也需要去获取某个节点的父节点,也就是包裹着当前节点的节点而使用parents则可以获得当前节点递归到顶层的所有父辈元素。 兄弟节点指的就是父节点相同的节点。 next_siblingprevious_sibling next_siblingsprevious_siblings
    • 兄弟节点
    • 父节点parentparents
    • descendants
    • contentschildren
  • 查找
代码语言:javascript
复制
soup.find('a')
soup.find('a',title='')
soup.find('a',id='')
soup.find('a',class='')

soup.find_all('a')
soup.find_all(['a','p'])
soup.find_all('a',limit=2)

soup.find_all(attrs={'class': 'sister'})

XPath

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

相比于BeautifulSoup,Xpath在提取数据时会更有效率。

安装

代码语言:javascript
复制
pip3 install lxml

具体语法

具体语法

具体使用

用法(一)

用法(二)

用法(三)

用text()获取某个节点下的文本(重点)

result=html.xpath('//li[@class="item-0"]/text()')

实战演练

爬取妹子图 网址:https://www.mzitu.com/

先给与全代码

代码语言:javascript
复制
Hostreferer = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
    'Referer':'http://www.mzitu.com'
}
Picreferer = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
    'Referer':'http://i.meizitu.net'
}

import requests
from lxml import etree
url = 'https://www.mzitu.com/page/{}'

def get_html(url):
    response = requests.get(url,headers=Hostreferer)
    html = response.text
    page = etree.HTML(html)
    title = page.xpath('//img[@class ="lazy"]/@alt')
    img_urls  =page.xpath('//img[@class ="lazy"]/@data-original')
    print("正在爬取“)
    return zip(title,img_urls)

def get_img(url):
    for index, url in get_html(url):
        with open('{}.jpg'.format(index), 'wb+') as f:
            res = requests.get(url, headers=Picreferer)
            f.write(res.content)

if __name__ == '__main__':
    i = int(input('爬几页:'))
    for j in range(1,i+1):
        url = 'https://www.mzitu.com/page/{}'.format(j)
        print('正在爬取第{}页'.format(j))
        get_img(url)

这里有个坑:关于图片防盗链的,要加上Referer

个人建议

  • 对于网页的解析,优先使用xpath
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BeautifulSoup安装
  • BeautifulSoup的使用
  • 节点对象
  • 如何使用
  • XPath
  • 安装
  • 用text()获取某个节点下的文本(重点)
  • 实战演练
  • 个人建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档