zoukankan      html  css  js  c++  java
  • python课程设计笔记(五) ----Resuests+BeautifulSoup (爬虫入门)

    官方参考文档(中文版):

    requests:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

    beautifulsoup:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

     这篇博客只是简单介绍思路,建议直接阅读上面的官方文档

     

    目标

    从一个HTML或XML文件中提取数据,节省人工的时间。我这里提取一个html页面(https://www.zxzhijia.com/tuce/f1301_h_m )的所有图片。

     

    需要安装的:requests  beautifulsouplxml解析器

    •  requests 安装: pip install requests
    • beautifulsoup 安装:pip install beautifulsoup4
    • lxml解析器安装:pip install lxml

    requests: 获取某个URL的内容。(这里只用到了获取HTML的内容)

    Beautiful Soup :从HTML或XML文件中提取数据。

    lxml解析器:beautifulsoup提取数据时用到。

    requests获得的HTML内容要用lxml解析,用BeautifulSoup提取。

     

    效果演示:

     爬取的HTML页面:https://www.zxzhijia.com/tuce/f1301_h_m,要爬取七张装修案例的图片,把图片路径放入MySQL数据库

    #爬取装修图片
    import requests
    import re  #正则表达式from bs4 import BeautifulSoup
    
    
    #利用requests获取html网页内容
    res=requests.get("https://www.zxzhijia.com/tuce/f1301_h_m")
    #传给beautifulsoup,指定用lxml解析器解析
    soup = BeautifulSoup(res.text, 'lxml')
    
    #获得指定7个img图像
    img_src=soup.find(name='div',class_='waterfall').findAll(name="img",src=re.compile("img"),limit=7)
    
    for img in img_src:
        img=img['src']  #抓取src属性的属性值(图片的href)print(img)

     

     

    详解beautifulsoup的作用

    res=requests.get("https://www.zxzhijia.com/tuce/f1301_h_m")

    soup = BeautifulSoup(res.text, 'lxml')

    这两句之后soup里面就有html的内容了。

    BeautifulSoup会将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment

     

    树形结构很关键,比如一段这样的html,(下面都以这段为例):

    <html>

    <head>

    <title>测试界面</title>

    </head>

    <body>

    <div>

    <ul class="c">

        <li class="c">beautifulsoup</li>

        <li><span>span里面的字</span>span外的字</li>

        <li><a href="#">链接</a></li>

    </ul>

    </div>

    </body>

     

    beautifulsoap会生成文档树,我把它画出来 了:

    (直接从ul开始画)--就已经这么麻烦了

    一个红框称为一个节点!!仔细看字符串也是一个节点!!

     

     

     

    分析文档树中的节点(红框框):

    • Tag类型:是最普通的节点,看图中这些,一个框叫一个Tag对象,不是”a””div”。看最上面的这个Tag对象,它的name(名字)是“ul”,它拥有的attributes(属性)是“class”,而这个属性的值为“c”。
    • NavigableString类型:普通字符串也一种节点类型。
    •  BeautifulSoup 类型:表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象。就是一个HTML转换成树以后最上方的节点,比<html>..</html>还高。
    • Comment类型:注释,不多讲。

     

     

    操作和遍历一个Tag对象的子节点

    Beautiful Soup提供了许多操作和遍历子节点的属性。

     1 获取单个Tag对象

    获取单个tag:  tag = soup.tag的名字    ----------这种方法只取当前名字的第一个Tag       

    import requests
    
    from bs4 import BeautifulSoup
    
    response=requests.get("http://localhost/test/test.html")
    
    soup = BeautifulSoup(response.text, 'lxml')
    
     
    
    tag=soup.li
    
    print(tag.name)
    
    #li
    print(tag.string)
    #beautifulsoup
    

     获取单个tag对象里面的子tag对象:   soup.tag名.tag名

     

    2 获取一堆tag对象,用find_all()方法  !!注意,返回的时子节点列表,获得tag对象或navigatestring对象需要遍历这个列表

    find_all( name , attrs , recursive , text , **kwargs )

    搜索当前tag的所有tag子节点,并判断是否符合条件,返回的是一堆子节点。

    name:tag的名字,可以是字符串('a')、正则表达式(了解re的使用),列表['a','div'],或者 True(全部) .

    attrs={‘属性名a’,‘属性值b’} :搜索子节点中拥有属性a,且a="b"的。

    一般写法:可以直接写成 属性名a=‘属性值b’   id='aaa'   ,多个时用”,”隔开就可以。

    对于css属性class 需要写成 _class="名称",这样单个多个都可以匹配。 不能写成class="  ",因为”class"时python保留字会有语法错误,写成attrs 时,如果class=“a b" ,就算只想搜索a,也必须写{”class":"a b"}才能搜索到这个tag,必须要完全匹配,所以不适合这么写。

    text :tag里面夹的string内容,soup.find_all(text=["Tillie", "Elsie", "Lacie"])

    limit:可以使用 limit 参数限制返回结果的数量。当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果。文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:

    soup.find_all("a", limit=2)

    recursive:调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False

     

    tag=soup.find_all("li")
    tag=soup.find_all(re.compile("l"))
    tag=soup.find_all(name='li',class_='c')
    tag=soup.find_all('li',attrs={'class','c'})
    tag=soup.find_all(True)
    tag=soup.fine_all('li',limit=2)

    find()方法:!!注意,获得的是一个子节点,就是tag对象或navigatestring对象,可以直接使用.name .string ['属性名']

    用法和find_all方法一样。唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果.

     

    3  获取tag对象的属性值和tag对象里面的字符串内容(<div>XXX</div>中的XXX)

    属性值:

      tag['属性名']

     字符串内容:

      .string

    一个tag对象中间的字符串,可以直接tag.string

    如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到子节点:tag.string

    如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同.

    如果tag有超过一个子节点就不能直接.string,只会输出None

    举例:遍历find_all()获得的list:

    tags=soup.find_all('li')
    for item in tags:
        print(item.string)
    
    #beautifulsoup
    #None
    #链接

    4 遍历一个tag对象的所有子节点

    .contents 一个tag对象的所有直接子节点组成的list

    循环遍历直接子节点 .children

    for child in tag.children:  
    
      print(child)

    循环遍历所有子节点 .descendants

    for child in tag.descendants:
      print(child)

     

     

     

  • 相关阅读:
    flash背景透明、置底、禁止放大 右键菜单
    SQL 命令
    php无刷新翻页,单独的一个文件加上一个JS即可搞定
    php jquery ajax无刷新评论 无刷新翻页,字数统计 绝对可以用
    input点击隐藏显示层
    jquery延迟加载图片
    用Javascript读取CheckBox数组的值
    链表结构_C语言实现
    struts2_自定义错误提示
    struts2_自定义对象设置
  • 原文地址:https://www.cnblogs.com/luiyuying/p/10053948.html
Copyright © 2011-2022 走看看