第六章 正则,BeautifulSoup,xpath

2023-05-16

文章目录

  • 1.正则
    • 1.1 提取字符串
    • 1.2 替换
    • 1.3 搜索
  • 2. beautifulsoup
    • 2.1 各种解析器
    • 2.2 提取方式
    • 2.3 find方法
      • 2.3.1 find
      • 2.3.2 find_all
      • 2.3.3 通过id和类型精确定位
        • 2.3.3.1 通过符合正则表达式的id定位
      • 2.3.4 通过内容查找元素
    • 2.4 获取父子节点和兄弟节点
      • 2.4.1 获取父子节点
        • 2.4.1.1 contents属性,提取一级子元素
        • 2.4.1.2 descendants属性,提取所有级子元素
        • 2.4.1.3 获取第一个父元素
        • 2.4.1.4 获取所有父元素
      • 2.4.2 获取兄弟节点
        • 2.4.2.1 获取之后的兄弟元素——next_siblings
        • 2.4.2.2 获取之前的兄弟元素——previous_siblings
      • 2.4.3 多值属性
  • 3. xpath基本语法
    • 3.1 xpath简介
    • 3.2 xpath术语
    • 3.3 xpath语法
      • 3.3.1 xpath基础表达式
      • 3.3.2 提取标签节点
      • 3.3.3 提取标签字符串:extract函数
      • 3.3.4 提取标签里的内容
        • 3.3.4.1 text()
        • 3.3.4.2 再反向演示一下extract的作用
        • 3.4.4.3 代码灵活化
        • 3.3.4.2 关于多值属性
          • 3.3.4.2.1 直接写@class要把所有属性都写上
          • 3.3.4.2.2 contains函数
    • 3.4 xpath的一些实用技巧和注意事项

1.正则

1.1 提取字符串

import re
#提取字符串
#替换
#搜索

info="姓名:bobby 1987 生日:1987年10月1日 本科:2005年9月1日"
print(re.findall("\d{4}",info))
result=re.match(".*生日.*?(\d{4}).*本科:(\d{4})",info)

#match方法是从字符串的最开始匹配的 .*贪婪匹配 .*?非贪婪匹配 打括号分组
print(result.group(1))
print(result.group(2))

在这里插入图片描述

1.2 替换

import re
#提取字符串
#替换
#搜索

info="姓名:bobby 1987 生日:1987年10月1日 本科:2005年9月1日"
#提取字符串
print(re.findall("\d{4}",info))
result=re.match(".*生日.*?(\d{4}).*本科:(\d{4})",info)

#match方法是从字符串的最开始匹配的 .*贪婪匹配 .*?非贪婪匹配 打括号分组
print(result.group(1))
print(result.group(2))

#替换
res=re.sub("\d{4}","2019",info)
res1=re.sub("本科:2005年9月1日","*************",info)
print("res="+res)
print("res1="+res1)

在这里插入图片描述

1.3 搜索

import re
#提取字符串
#替换
#搜索

info="姓名:bobby 1987 生日:1987年10月1日 本科:2005年9月1日"
#提取字符串
print(re.findall("\d{4}",info))
result=re.match(".*生日.*?(\d{4}).*本科:(\d{4})",info)

#match方法是从字符串的最开始匹配的 .*贪婪匹配 .*?非贪婪匹配 打括号分组
print(result.group(1))
print(result.group(2))

#替换
res=re.sub("\d{4}","2019",info)
res1=re.sub("本科:2005年9月1日","*************",info)
print("res="+res)
print("res1="+res1)

#搜索
name="my name is bobby"

print(re.search("bobby",name))
print(re.search("bobby",name).group())
#re.IGNORECASE忽略大小写
name1="my name is Bobby"
print(re.search("bobby",name1,re.IGNORECASE).group())

在这里插入图片描述

#DOTALL模式,即使换行符也可以继续读
print(re.match(".*bobby",name2,re.DOTALL).group())

在这里插入图片描述

2. beautifulsoup

通过这个库来知道将Html页面下载下来之后我们如何去解析html里面的元素,如何从这些元素中提取出我们想要的一些值,下载一定要下载beautifulsoup4。

2.1 各种解析器

在这里插入图片描述

2.2 提取方式

bs=BeautifulSoup(html,“html.parser”)
提取方式,首先定位到这个元素,所有操作都是基于bs这个对象进行的,如果要取它的title,可以直接写bs.title。点取属性,返回的是BeautifulSoup里面的一个类。
title_tag=bs.title
在类上就可以进行取值,在类上有一个属性string,可以用它直接获取内容。
print(title_tag.string)

from bs4 import BeautifulSoup
html="""
<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>


    <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>

    <meta charset="UTF-8">
    <title>CHINA IN HISTORY</title>

    <style type="text/css">
        .carousel-caption {
            background: #000000;/*设置容器背景颜色为黑色*/
            color: #ffffff;/*设置文本颜色为白色*/
            opacity: 0.7;/*设置透明度为 70%*/
            filter:alpha(opacity=70);/*设置透明度兼容 ie8 及以下版本*/
            font-family: 宋体;/*设置字体*/
            font-size: 18px;
            width: 100%;/*设置容器宽度*/
            left: 0px;/*设置容器左边缘位置*/
            bottom: 0px;/*设置容器下边缘位置*/
        }
        body{
            background-color: whitesmoke;
        }

    </style>

</head>
<body>
<div class="container-fluid" style="background-color: #ffffff"><img src="image/Logo1.png" width="480" height="140"></div>
<div class="container-fluid" id="asd" style="background-color:#eaeaea;opacity: 80%">
    <div class="container">
        <ul class="nav nav-pills">
            <li ><a href="#" class="text-dark">首页</a></li>
            <li><a href="#" class="text-dark">民族英雄</a></li>
            <li><a href="#" class="text-dark">历史机遇</a></li>
            <li data-toggle="modal" data-target="#myModal"><a href="#" class="text-dark">注册</a></li>
            <li data-toggle="modal" data-target="#myModal2"><a href="#" class="text-dark">登录</a></li>
            <li>
                <input type="text" style="border-radius: 2px;width: 300px;margin-top: 7px;margin-left: 340px">
                <button style="border-radius: 2px">
                    <span class="glyphicon glyphicon-search"></span>搜索
                </button>
            </li>
        </ul>
    </div>
</div>

<div class="container mt-3">
    <div class="row ">
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <img src="image/img_1.png" class="card-img-top" alt="...">
            <div >
                <h5 class="card-title" style="font-size: 20px">仕女图是中国历史文化的璀璨一角</h5>
                <p class="card-text">仕女图亦称“仕女画”,是以中国封建社会宫女为题材的绘画艺术作品。仕女图最早出现于魏晋南北朝,繁荣兴盛于唐宋时期,元代因社会动荡政治冲突逐渐衰退,明清时期再次兴盛,并出现创作的鼎盛时代。魏晋以来,有一批历代名家的《仕女图》,将女性温柔婉约、仪态容貌描绘得栩栩如生、活灵活现,让人拍手叫绝,叹为观止!</p>
            </div>

            <blockquote class="blockquote mb-0 card-body border mt-2">
                <p>中国艺术文化重形象思维,重传神,重意境。无论哪种笔法,都晕染着真善美。</p>
                <footer class="blockquote-footer">
                    艺术体现中国人的观念,也温润着中国人的心性。
                </footer>
            </blockquote>
            <br/><br/>
            <div class="card bg-light mb-3 ml-4 border" style="max-width: 60rem;">
                <div class="card-header" >近期文章</div>
                <div class="card-body">
                    <p class="card-text">
                        <a href="https://yizhongtian.blog.caixin.com/archives/255274" class="text-blue">易中天:中华文明以唐宋为高峰,元明清走了下坡路</a>
                        <br/><br/>
                        <a href="http://www.qulishi.com/article/202203/595802.html" class="text-blue">历史上曹操要血洗徐州的原因是什么?与曹嵩有何关系</a>
                        <br/><br/>
                        <a href="https://world.gmw.cn/2020-11/12/content_34363873.htm"class="text-blue">中国加快国防和军队现代化步伐</a>
                        <br/><br/>
                        <a href="https://www.sohu.com/a/530450019_265827" class="text-blue">人民日报看吉林:坚定必胜决心 尽快控制疫情</a>
                    </p>
                </div>

            </div>


        </div>
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <img src="image/img_2.png" class="card-img-top" alt="...">
            <div class="card-body">
                <h5 class="card-title" style="font-size: 20px">世人都知于谦石灰吟,却少知这位清官也是一位显赫的民族战斗英雄</h5>
                <p class="card-text">于谦远比我们知道的丰富很多,他所在的时代,宦官坏国,然而王振却依旧动不得于谦,每当权势滔天的王振想解决于谦,他的命令总是无法执行,得到的回应总是警告:你最好别动这个人。并非天子保于谦,而是对于于谦,识者无不敬服!在明朝最困难的时候,于谦运筹帷幄,杀伐果断,力挽狂澜,体现出超人的军事能力,他死后,锦衣卫搜查其家落泪,太后为他水米不进。英雄陨落,悲矣!</p>
                <p class="card-text"><small class="text-muted"></small></p>
                <blockquote class="blockquote mb-0  text-center p-3" style="background-color: #f3f5f5">
                    <p>于谦为官兢兢业业,为百姓鞠躬尽瘁,但真正让他大施拳脚的时刻是土木堡之变。</p>
                    <p>于谦深知国不可一日无君,在皇帝沦为阶下囚,太子尚为襁褓,大明朝面临大厦将倾局面时,冒天下之大不韪,奏请郕王为帝,用于稳定局面。</p>
                    <p>有人说,中国人被一群英雄保护得好好的。我想说是的,中国从来不缺英雄,并且中国民众追随英雄。</p>
                </blockquote>
            </div>
        </div>
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <div class="card text-center " style="background-color: #ffffff">
                <div class="card-body">
                    <h5 class="card-title">掠影惊鸿</h5>
                    <p class="card-text" style="font-size: 15px">历史中的中国,就如一个男人成长。自负,鞭策,灾难,荣光壹壹经历。
                        近代史惨痛,可更早的历史中国是站在最高点的国邦。威震四海,不可撼动。
                        臣服,交好。是其他国家的选择。<br/><br/>
                        可是1900年中国跌倒了,倒了很久,以至于动荡战乱,老一辈记忆刻下不可磨灭的悲痛。
                        中国当然会再站起来,在00后出生的50年前,毛泽东在天安门一锤定音。
                        新时代青年大多知道祖国经历民族耻辱,民族光辉事件的皮毛,却少有人去细看中国为什么能崛起,
                        历史中的中国做过哪些挣扎,又有哪些冲突。<br/><br/>
                        我始终认为,中国的进步,是由无数个在领导位置、沉稳决策的智者与善良爱国、执行正确方针的民众打造的。
                        前者甚至比后者更重要。
                        这个网页就是用来稍稍记录历史中的中国如何走向今日繁华。更祝愿我华夏千秋业新篇永续!</p>
                    <p class="card-text"><small class="text-muted"></small></p>
                </div>
            </div>
            <div class="card mt-5">
                <img src="image/img_3.jpg" class="card-img-top" alt="...">
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4 ">
            <div class="card bg-light text-white border">
                <div class="card-header" style="background-color: #c7cece">快捷通道</div>
                <div class="card-body">
                    <p class="card-text">
                    <div class="row">
                        <div class="col-md-4"><a href="http://www.hnmuseum.com/"><img src="image/hunan.png" width="90" height="90"></a> </div>
                        <div class="col-md-4"><a href="http://www.njmuseum.com/zh"><img src="image/nanjing.png" width="90" height="90"></a> </div>
                        <div class="col-md-4"><a href="https://www.xabwy.com/"><img src="image/xian.png" width="90" height="90"></a> </div>
                    </div>
                    <div class="row">
                        <div class="col-md-4 mt-2"><a href="http://www.scmuseum.cn/"><img src="image/sichuan.png" width="90" height="90"></a> </div>
                        <div class="col-md-4 mt-2"><a href="https://www.zhejiangmuseum.com/"><img src="image/zhejiang.png" width="90" height="90"></a> </div>
                        <div class="col-md-4 mt-2"><a href="https://www.shanghaimuseum.net/mu/frontend/pg/index"><img src="image/shanghai.png" width="90" height="90"></a> </div>
                    </div>

                    </p>
                </div>
            </div>
        </div>

        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4 ">
            <video controls src="image/video1.mp4"width="100%" style="top: 100px;border: 0px solid;solid-color: #1b1e21"></video>
        </div>
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <div class="card p-3 text-right">
                <blockquote class="blockquote mb-0">
                    <p style="font-size: 20px;text-align: center">如果你要和平,请准备战争。</p>
                    <footer class="blockquote-footer">

                        古罗马著名军事著作家 韦格蒂乌斯

                    </footer>
                </blockquote>
            </div>

            <div class="card p-3 text-right mt-5">
                <blockquote class="blockquote mb-0">
                    <p style="font-size: 20px;text-align: center">和平时代,军队还是应该保持锐气,万不可得"和平病"。</p>
                    <footer class="blockquote-footer">

                        电视剧《王牌部落》

                    </footer>
                </blockquote>
            </div>
        </div>
    </div>

</div>
<footer style="text-align: center">
    <div class="container-fluid" style="height:300px ;background-color: #cdc3be">
        <div class="mt-5" style="text-align: center">
            <img src="image/Logo1.png" height="100" width="320">
            <p>1234567 | 7654321</p>
            <p>jsdxrjxy@163.com</p>
            <p>地址:湖南省张家界市子午路 | 版权所有:吉首大学软件服务外包学院</p>
        </div>
    </div>
</footer>
</body>
</html>
"""

bs=BeautifulSoup(html,"html.parser")
title_tag=bs.title
print(title_tag.string)

在这里插入图片描述
取div时会发现如果用点属性,只会取到第一个满足条件的div,所以上述方法适用的是像title这样只有一个的属性,像div这样有许多个的,就要用另外的方法——find。

2.3 find方法

bs=BeautifulSoup(html,“html.parser”)

2.3.1 find

bs.find(“div”) 也只能找到第一个符合条件的div

2.3.2 find_all

bs.find_all(“div”) 返回所有的div
可以用for循环来输出

div_tags=bs.find_all("div")

for tag in div_tags:
    print(tag.string)

很多时候我们需要进一步定位,比如id来定位。

2.3.3 通过id和类型精确定位

div_tag1=bs.find("div",id="aaa")
print(div_tag1)

在这里插入图片描述

2.3.3.1 通过符合正则表达式的id定位

将上面的id="aaa"改为id="aaa-9999"方便演示

div_tag1=bs.find("div",id=re.compile("aaa-\d+"))
print(div_tag1)

在这里插入图片描述

2.3.4 通过内容查找元素

在这里插入图片描述
但是目前看作用不大,string后面也可以用正则
在这里插入图片描述

2.4 获取父子节点和兄弟节点

2.4.1 获取父子节点

2.4.1.1 contents属性,提取一级子元素

bs=BeautifulSoup(html,"html.parser")
div_tag2=bs.find("div",re.compile("bbb-\d+"))
childrens=div_tag2.contents
for child in childrens:
	print(child.name)

在这里插入图片描述
None是因为程序把\n解析了,所以我们要加个判断

bs=BeautifulSoup(html,"html.parser")
div_tag1=bs.find("div",re.compile("bbb-\d+"))
childrens=div_tag1.contents
for child in childrens:
    if child.name:
        print(child.name)

在这里插入图片描述

2.4.1.2 descendants属性,提取所有级子元素

bs=BeautifulSoup(html,"html.parser")
div_tag2=bs.find("div",re.compile("bbb-\d+"))
childrens=div_tag2.descendants
for child in childrens:
	if child.name:
		print(child.name)

2.4.1.3 获取第一个父元素

注意:如果find()写find(“p”,class=“name”),class是关键词,冲突,所以要换个写法:
bs.find(“p”,{“class”:“name”})

bs=BeautifulSoup(html,"html.parser")
parent=bs.find("h5",{"class":"card-title"}).parent
print(parent)

在这里插入图片描述

2.4.1.4 获取所有父元素

bs=BeautifulSoup(html,"html.parser")
parents=bs.find("h5",{"class":"cart-title"})
for parent in parents:
	print(parent.name)

在这里插入图片描述

2.4.2 获取兄弟节点

2.4.2.1 获取之后的兄弟元素——next_siblings

bs=BeautifulSoup(html,"html.parser")
next_siblings=bs.find("p",string=re.compile("于谦深知.*")).next_siblings
for sibling in next_siblings:
	print(sibling.string)

原码参照:
在这里插入图片描述
代码运行结果:
在这里插入图片描述
可以看见后面的兄弟元素内容提取出来了,前面的没有。那么如何提取前面的兄弟元素呢?

2.4.2.2 获取之前的兄弟元素——previous_siblings

bs=BeautifulSoup(html,"html.parser")
privious_siblings=bs.find("p",string=re.compile("于谦深知.*")).previous_siblings
for sibling in privious_siblings:
    print(sibling.string)

源码参考:
在这里插入图片描述
代码运行结果:
在这里插入图片描述
siblings用单数sibling可以取到前面一个兄弟元素,但是会受换行符的影响,换行符也会被当做兄弟元素

2.4.3 多值属性

tag=bs.find("p",string=re.compile("于谦为官.*"))
print(tag["class"])
print(tag.get("class"))

源码参考:
在这里插入图片描述
代码运行结果:
在这里插入图片描述
多值属性返回列表
单值属性返回字符串

3. xpath基本语法

3.1 xpath简介

在这里插入图片描述
在这里插入图片描述

3.2 xpath术语

在这里插入图片描述

3.3 xpath语法

3.3.1 xpath基础表达式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
利用浏览器自动生成xpath路径
在这里插入图片描述
把xpath复制到编译器内时,注意双引号里面的双引号得换成单引号

3.3.2 提取标签节点

from scrapy import Selector
html="""
<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>


    <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>

    <meta charset="UTF-8">
    <title>CHINA IN HISTORY</title>

    <style type="text/css">
        .carousel-caption {
            background: #000000;/*设置容器背景颜色为黑色*/
            color: #ffffff;/*设置文本颜色为白色*/
            opacity: 0.7;/*设置透明度为 70%*/
            filter:alpha(opacity=70);/*设置透明度兼容 ie8 及以下版本*/
            font-family: 宋体;/*设置字体*/
            font-size: 18px;
            width: 100%;/*设置容器宽度*/
            left: 0px;/*设置容器左边缘位置*/
            bottom: 0px;/*设置容器下边缘位置*/
        }
        body{
            background-color: whitesmoke;
        }

    </style>

</head>
<body>
<div class="container-fluid" style="background-color: #ffffff"><img src="image/Logo1.png" width="480" height="140"></div>
<div class="container-fluid" id="asd" style="background-color:#eaeaea;opacity: 80%">
    <div class="container">
        <ul class="nav nav-pills">
            <li ><a href="#" class="text-dark">首页</a></li>
            <li><a href="#" class="text-dark">民族英雄</a></li>
            <li><a href="#" class="text-dark">历史机遇</a></li>
            <li data-toggle="modal" data-target="#myModal"><a href="#" class="text-dark">注册</a></li>
            <li data-toggle="modal" data-target="#myModal2"><a href="#" class="text-dark">登录</a></li>
            <li>
                <input type="text" style="border-radius: 2px;width: 300px;margin-top: 7px;margin-left: 340px">
                <button style="border-radius: 2px">
                    <span class="glyphicon glyphicon-search"></span>搜索
                </button>
            </li>
        </ul>
    </div>
</div>

<div class="container mt-3">
    <div class="row ">
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <img src="image/img_1.png" class="card-img-top" alt="...">
            <div id="aaa-9999">
                <h5 class="card-title" style="font-size: 20px">仕女图是中国历史文化的璀璨一角</h5>
                <p class="card-text">仕女图亦称“仕女画”,是以中国封建社会宫女为题材的绘画艺术作品。仕女图最早出现于魏晋南北朝,繁荣兴盛于唐宋时期,元代因社会动荡政治冲突逐渐衰退,明清时期再次兴盛,并出现创作的鼎盛时代。魏晋以来,有一批历代名家的《仕女图》,将女性温柔婉约、仪态容貌描绘得栩栩如生、活灵活现,让人拍手叫绝,叹为观止!</p>
            </div>

            <blockquote class="blockquote mb-0 card-body border mt-2">
                <p>中国艺术文化重形象思维,重传神,重意境。无论哪种笔法,都晕染着真善美。</p>
                <footer class="blockquote-footer">
                    艺术体现中国人的观念,也温润着中国人的心性。
                </footer>
            </blockquote>
            <br/><br/>
            <div class="card bg-light mb-3 ml-4 border" style="max-width: 60rem;">
                <div class="card-header" >近期文章</div>
                <div class="card-body">
                    <p class="card-text">
                        <a href="https://yizhongtian.blog.caixin.com/archives/255274" class="text-blue">易中天:中华文明以唐宋为高峰,元明清走了下坡路</a>
                        <br/><br/>
                        <a href="http://www.qulishi.com/article/202203/595802.html" class="text-blue">历史上曹操要血洗徐州的原因是什么?与曹嵩有何关系</a>
                        <br/><br/>
                        <a href="https://world.gmw.cn/2020-11/12/content_34363873.htm"class="text-blue">中国加快国防和军队现代化步伐</a>
                        <br/><br/>
                        <a href="https://www.sohu.com/a/530450019_265827" class="text-blue">人民日报看吉林:坚定必胜决心 尽快控制疫情</a>
                    </p>
                </div>

            </div>


        </div>
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <img src="image/img_2.png" class="card-img-top" alt="...">
            <div class="card-body" id="bbb-9999">
                <h5 class="card-title" style="font-size: 20px">世人都知于谦石灰吟,却少知这位清官也是一位显赫的民族战斗英雄</h5>
                <p class="card-text">于谦远比我们知道的丰富很多,他所在的时代,宦官坏国,然而王振却依旧动不得于谦,每当权势滔天的王振想解决于谦,他的命令总是无法执行,得到的回应总是警告:你最好别动这个人。并非天子保于谦,而是对于于谦,识者无不敬服!在明朝最困难的时候,于谦运筹帷幄,杀伐果断,力挽狂澜,体现出超人的军事能力,他死后,锦衣卫搜查其家落泪,太后为他水米不进。英雄陨落,悲矣!</p>
                <p class="card-text"><small class="text-muted"></small></p>
                <blockquote class="blockquote mb-0  text-center p-3" style="background-color: #f3f5f5">
                    <p class="yuqian0 yuqian1">于谦为官兢兢业业,为百姓鞠躬尽瘁,但真正让他大施拳脚的时刻是土木堡之变。</p>
                    <p>于谦深知国不可一日无君,在皇帝沦为阶下囚,太子尚为襁褓,大明朝面临大厦将倾局面时,冒天下之大不韪,奏请郕王为帝,用于稳定局面。</p>
                    <p>有人说,中国人被一群英雄保护得好好的。我想说是的,中国从来不缺英雄,并且中国民众追随英雄。</p>
                </blockquote>
            </div>
        </div>
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <div class="card text-center " style="background-color: #ffffff">
                <div class="card-body">
                    <h5 class="card-title">掠影惊鸿</h5>
                    <p class="card-text" style="font-size: 15px">历史中的中国,就如一个男人成长。自负,鞭策,灾难,荣光壹壹经历。
                        近代史惨痛,可更早的历史中国是站在最高点的国邦。威震四海,不可撼动。
                        臣服,交好。是其他国家的选择。<br/><br/>
                        可是1900年中国跌倒了,倒了很久,以至于动荡战乱,老一辈记忆刻下不可磨灭的悲痛。
                        中国当然会再站起来,在00后出生的50年前,毛泽东在天安门一锤定音。
                        新时代青年大多知道祖国经历民族耻辱,民族光辉事件的皮毛,却少有人去细看中国为什么能崛起,
                        历史中的中国做过哪些挣扎,又有哪些冲突。<br/><br/>
                        我始终认为,中国的进步,是由无数个在领导位置、沉稳决策的智者与善良爱国、执行正确方针的民众打造的。
                        前者甚至比后者更重要。
                        这个网页就是用来稍稍记录历史中的中国如何走向今日繁华。更祝愿我华夏千秋业新篇永续!</p>
                    <p class="card-text"><small class="text-muted"></small></p>
                </div>
            </div>
            <div class="card mt-5">
                <img src="image/img_3.jpg" class="card-img-top" alt="...">
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4 ">
            <div class="card bg-light text-white border">
                <div class="card-header" style="background-color: #c7cece">快捷通道</div>
                <div class="card-body">
                    <p class="card-text">
                    <div class="row">
                        <div class="col-md-4"><a href="http://www.hnmuseum.com/"><img src="image/hunan.png" width="90" height="90"></a> </div>
                        <div class="col-md-4"><a href="http://www.njmuseum.com/zh"><img src="image/nanjing.png" width="90" height="90"></a> </div>
                        <div class="col-md-4"><a href="https://www.xabwy.com/"><img src="image/xian.png" width="90" height="90"></a> </div>
                    </div>
                    <div class="row">
                        <div class="col-md-4 mt-2"><a href="http://www.scmuseum.cn/"><img src="image/sichuan.png" width="90" height="90"></a> </div>
                        <div class="col-md-4 mt-2"><a href="https://www.zhejiangmuseum.com/"><img src="image/zhejiang.png" width="90" height="90"></a> </div>
                        <div class="col-md-4 mt-2"><a href="https://www.shanghaimuseum.net/mu/frontend/pg/index"><img src="image/shanghai.png" width="90" height="90"></a> </div>
                    </div>

                    </p>
                </div>
            </div>
        </div>

        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4 ">
            <video controls src="image/video1.mp4"width="100%" style="top: 100px;border: 0px solid;solid-color: #1b1e21"></video>
        </div>
        <div class="col-lg-4 col-sm-4 col-md-4 col-xl-4">
            <div class="card p-3 text-right">
                <blockquote class="blockquote mb-0">
                    <p style="font-size: 20px;text-align: center">如果你要和平,请准备战争。</p>
                    <footer class="blockquote-footer">

                        古罗马著名军事著作家 韦格蒂乌斯

                    </footer>
                </blockquote>
            </div>

            <div class="card p-3 text-right mt-5">
                <blockquote class="blockquote mb-0">
                    <p style="font-size: 20px;text-align: center">和平时代,军队还是应该保持锐气,万不可得"和平病"。</p>
                    <footer class="blockquote-footer">

                        电视剧《王牌部落》

                    </footer>
                </blockquote>
            </div>
        </div>
    </div>

</div>
<footer style="text-align: center">
    <div class="container-fluid" style="height:300px ;background-color: #cdc3be">
        <div class="mt-5" style="text-align: center">
            <img src="image/Logo1.png" height="100" width="320">
            <p>1234567 | 7654321</p>
            <p>jsdxrjxy@163.com</p>
            <p>地址:湖南省张家界市子午路 | 版权所有:吉首大学软件服务外包学院</p>
        </div>
    </div>
</footer>
</body>
</html>
"""
sel=Selector(text=html)
tag=sel.xpath("//*[@id="bbb-9999"]/p[1]")
print(tag)
print(tag.__class__)

在这里插入图片描述
可以看到,要的标签就是data里的值,那么怎么提取data里的值呢

3.3.3 提取标签字符串:extract函数

extract这个单词本身就是提取的意思,提取data里的值,返回为字符串list,因为有可能有多个值

from scrapy import Selector
sel=Selector(text=html).extract()
print(sel)
print(sel.__class__)

在这里插入图片描述

返回的是一个list,因为有可能有多个值,取第一个值就在extract()后面加个[0]

sel=Selector(text=html)
tag0=sel.xpath("//*[@id='bbb-9999']/p").extract()
tag=sel.xpath("//*[@id='bbb-9999']/p").extract()[0]
print(tag0)
print(tag0.__class__)
print(tag)
print(tag.__class__)

在这里插入图片描述
注意:extract()返回的list可能是个空值,这时候取[0]会抛异常,所以最好做下判断
在这里插入图片描述

3.3.4 提取标签里的内容

3.3.4.1 text()

在xpath(“//*[@id=‘bbb-9999’]/p[1]”)中的xpath表达式的后面加上/text()就可以获得所找标签的内容
源码参考:
在这里插入图片描述

sel=Selector(text=html)
tag=sel.xpath("//*[@id='bbb-9999']/blockquote/p/text()").extract()
print(tag)
print(tag.__class__)

在这里插入图片描述

sel=Selector(text=html)
tag=sel.xpath("//*[@id='bbb-9999']/blockquote/p/text()").extract()[0]
print(tag)
print(tag.__class__)

在这里插入图片描述

3.3.4.2 再反向演示一下extract的作用

sel=Selector(text=html)
tag=sel.xpath("//*[@id='bbb-9999']/blockquote/p/text()")
print(tag)
print(tag.__class__)

在这里插入图片描述

3.4.4.3 代码灵活化

sel=Selector(text=html)
name_xpath="//*[@id='bbb-9999']/blockquote/p/text()"
name=""
tag_texts=sel.xpath(name_xpath).extract()
if tag_texts:
    name=tag_texts[0]
print(name)

3.3.4.2 关于多值属性

3.3.4.2.1 直接写@class要把所有属性都写上
sel=Selector(text=html)
tag=sel.xpath("//div[@class='aaa aa']/p/text()").extract()
print(tag)

源码参考:
在这里插入图片描述
运行结果:
在这里插入图片描述
那要是这个class属性又多又长,都要写上岂非太烦?所以有一个叫contains的函数,可实现四两拨千斤。

3.3.4.2.2 contains函数
sel=Selector(text=html)
tag=sel.xpath("//div[contains(@class,'aa')]/p/text()").extract()
print(tag)

运行结果:
在这里插入图片描述
源码参考:
在这里插入图片描述
用contains,就算class的一个值没有写完整也可以查,比如上面,我写个a来查也可以
除了contains,其它内置方法还有很多,可以去https://developer.mozilla.org/en-US/docs/Web/XPath/Functions查看

还可以直接获取属性:

sel=Selector(text=html)
tag=sel.xpath("//div[contains(@class,'aa')]/@class")
print(tag)

在这里插入图片描述

tag=sel.xpath("//div[contains(@class,'aa')]/@class").extract()
print(tag)

在这里插入图片描述
另一个示例
在这里插入图片描述
|在xpath里是和的意思

3.4 xpath的一些实用技巧和注意事项

①xpath括号里的语法是从1开始的。
②如果一列标签要截取里面的一段,可以用列表里切片的方法:
在这里插入图片描述
③可以以已经得到的xpath对象再进行xpath语法
在这里插入图片描述

在这里插入图片描述
. 代表当前元素item

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第六章 正则,BeautifulSoup,xpath 的相关文章

  • 怎样快速开发一个 Dubbo 应用?

    背景 本文将以 Dubbo 为例 xff0c 介绍如何快速开发一个 Dubbo 应用 为了便于读者理解 xff1a 首先会介绍一下传统的 RMI 的基本概念 然后比较下现代的 RPC 框架与 RMI 的区别 再基于 Dubbo 提供的 AP
  • 百度历届笔试题(1)

    题目描述 牛牛和妞妞正在玩一个猜数游戏 xff0c 妞妞心里想两个不相等的正数 xff0c 把这两个正数的和y告诉牛牛 妞妞声称这两个数都不超过x xff0c 让牛牛猜这两个数是多少 牛牛每猜一次 xff0c 妞妞会告诉他猜对了还是猜错了
  • systemd service 配置自启动,配置多个环境变量,最大打开文件数

    一 创建service文件 样例 vim usr lib systemd system nacos service Unit Description 61 nacos After 61 network target Service Type
  • IntelliJ IDEA 架构概述(面向插件开发者)

    原文未定稿 2014 11 这篇文章的目的是从插件开发者的视角描述IntelliJ IDEA的结构 文章将以一种任务驱动的方式组织 xff1a 相比列出所有你可以对各组件对象进行的操作并描述这些操作它们的实现方式 xff0c 这篇文章将尽可
  • 用大数据思维做运维监控

    今天一大早就看到了一篇文章 xff0c 叫 大数据对于运维的意义 该文章基本上是从三个层面阐述的 xff1a 工程数据 xff0c 譬如工单数量 xff0c SLA可用性 xff0c 基础资源 xff0c 故障率 xff0c 报警统计业务数
  • 仿滴滴抢单倒计时的Demo

    滴滴里面有一个下单完成之后等待界面的倒计时转圈的视图 就是这个 原理 xff1a 通过CAShapeLayer层添加到自己自定义的视图layer上 设置ShapeLayer的path 他的路劲绘制一般通过UIBezierPath配合设置 通
  • iOS开发之自己封装的提示框(警告框)样式BHAlertView

    最近需要使用到提示框 xff08 警告框 xff09 进行信息的展示和提醒 xff0c 所以进行了一个类的封装 xff0c 想用Swift调用此OC文件 xff0c 但是发现有些困难 xff0c 所以暂时先把OC代码进行展示 xff0c 随
  • 使用ActiveMQ进行C++与C#的通信

    该系列文章介绍如何通过ActiveMQ在C 43 43 和C 控制台项目之间通信 关于ActiveMQ的介绍可以参考 深入浅出ActiveMQ xff0c 平台搭建可以参考 Activemq 平台搭建与C 示列 xff0c 两者之间有交叉内
  • Centos8防火墙设置

    进程与状态相关 systemctl start firewalld service 启动防火墙 systemctl stop firewalld service 停止防火墙 systemctl status firewalld 查看防火墙状
  • c/c++笔试

    1 xff0e 进程和线程的差别 线程是指进程内的一个执行单元 也是进程内的可调度实体 与进程的区别 1 调度 xff1a 线程作为调度和分配的基本单位 xff0c 进程作为拥有资源的基本单位 2 并发性 xff1a 不仅进程之间可以并发执
  • android onNewIntent 调用时机

    当前Activity已经在Activity堆栈当中时 xff0c 主要取决于LaunchMode对应的设置 LaunchMode为SingleTop时 xff0c 如果ActivityA在栈顶 且现在要再启动ActivityA xff0c
  • 不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式

    不知道怎么开发VR游戏 xff1f Unity5 3官方VR教程重磅登场 系列3 VR中的交互方式 王寒 4 个月前 https zhuanlan zhihu com p 20505470 概览 xff1a 在VR项目中 xff0c 我们需
  • Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”

    想利用传统的线程通信wait notify xff0c notifyAll 方法 xff0c 必须依赖于同步监听器的存在 xff0c 也就是说 xff0c 对于synchronized修饰的同步方法 xff0c 因为该类的默认实例 xff0
  • java TCP/IP实现简单的多人聊天功能

    TCP IP是可靠的网络协议 xff0c 数据的传输需要服务端和客户端之间三次 握手 xff0c 比较适合文本等一些可靠性要求高的数据传输 xff0c 但是它的效率较UDP低 下面通过一张图来简要说明使用 ServerSocket 创建 T
  • JavaScript开发工具WebStorm使用教程:从命令行运行代码检查

    从命令行运行代码检查 WebStorm运行代码检查可以发现并突出显示语法错误 死代码 可能的错误 错误的编码风格和其他问题 还可以从命令行为特定项目运行所有已配置的检查 xff0c 并将结果存储为 XML JSON 或带有报告的纯文本文件
  • 基于Spark的机器学习经验

    这篇内容基于我去年的一些感悟写的 xff0c 但是今年才在Stuq 的微信群做的分享 从技术角度而言 xff0c 对Spark的掌握和使用还是显得很手生的 但是今天一位做数据分析相关的朋友说 xff0c 受这篇内容影响 xff0c 他接受了
  • Linux(manjaro)微信web开发者工具

    安装 wine和winetricks span class hljs built in sudo span pacman S wine winetricks 打开winetricks 安装需要的组件 安装linux版本运行程序 github
  • C++类与对象

    C 43 43 面向对象 一 面向对象程序设计方法概述 1 凡是以类对象为基本构成单位的程序称为基于对象的程序 2 面向对象和面向过程的区别 xff1a 在笔者看来 xff0c 通俗地讲 xff0c 面向对象 就是在描述一个对象 xff0c
  • SVN无法提交修改问题

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • AbstractApplicationContext.refresh()应用上下文刷新方法

    前情提要 学习源码光看博客文章基本没有记住的可能 结合源码和博客 43 实践才能够通过理解记住 看了很多天才断断续续看完 发现它和其他IOC Bean生命周期都有关联 将之前片段式的认知串联起来了 这个刷新的代码很长 建议没耐心的时候就先不

随机推荐

  • IIC协议--简要理解

    1 iic协议是什么 xff1f IIC Inter xff0d Integrated Circuit 总线是一种由 PHILIPS 公司开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 它是由数据线 SDA 和时钟 SCL
  • RISC与CISC比较

    RISC的设计重点在于降低由硬件执行指令的复杂度 xff0c 因为软件比硬件容易提供更大的灵活性和更高的智能 xff0c 因此RISC设计对编译器有更高的要求 xff1b CISC的设计则更侧重于硬件执行指令的功能 xff0c 使CISC的
  • 操作系统选择调度方式和算法的若干准则

    1 调度的类型 按调度的层次 xff1a 长期 xff08 长程 作业 高级 xff09 调度 xff1b 中期 xff08 中级 中程 xff09 调度 xff1b 短期 xff08 短程 进程 低级 xff09 调度 按OS 的类型 x
  • 提灯过桥问题

    题目 xff1a 小明一家过一座桥 xff0c 过桥时是黑夜 xff0c 所以必须有灯 现在小明过桥要1秒 xff0c 小明的弟弟要3秒 xff0c 小明的爸爸要6秒 xff0c 小明的妈妈要8秒 xff0c 小明的爷爷要12秒 每次此桥最
  • 如何判断一个整数数组中是否有重复元素

    题目 xff1a 写一个函数判断一个int类型的数组是否是有效的 所谓有效是指 xff1a 假设数组大小为n xff0c 那么这个int数组里的值为0 n 1之间的数 xff0c 并且每个数只能出现一次 xff0c 否则就是无效数组 例如
  • 2014百度校招开发测试工程师笔试题

    时间 xff1a 2013 9 28 地点 xff1a 深圳 职位 xff1a 开发测试工程师
  • Spark Streaming + Spark SQL 实现配置化ETL流程

    Spark Streaming 非常适合ETL 但是其开发模块化程度不高 xff0c 所以这里提供了一套方案 xff0c 该方案提供了新的API用于开发Spark Streaming程序 xff0c 同时也实现了模块化 xff0c 配置化
  • 整体了解HADOOP框架及一些开源项目

    Hadoop框架中 xff0c 有很多优秀的工具 xff0c 帮助我们解决工作中的问题 Hadoop的位置 从上图可以看出 xff0c 越往右 xff0c 实时性越高 xff0c 越往上 xff0c 涉及到算法等越多 越往上 xff0c 越
  • Kafka简介

    Kafka简介 在当前的大数据时代 xff0c 第一个挑战是海量数据的收集 xff0c 另一个就是这些数据的分析 数据分析的类型通常有用户行为数据 应用性能跟踪数据 活动数据日志 事件消息等 消息发布机制用于连接各种应用并在它们之间路由消息
  • Flume入门笔记------架构以及应用介绍

    在具体介绍本文内容之前 xff0c 先给大家看一下Hadoop业务的整体开发流程 xff1a 从Hadoop的业务开发流程图中可以看出 xff0c 在大数据的业务处理过程中 xff0c 对于数据的采集是十分重要的一步 xff0c 也是不可避
  • 分布式服务框架dubbo原理解析

    alibaba有好几个分布式框架 xff0c 主要有 xff1a 进行远程调用 类似于RMI的这种远程调用 的 dubbo hsf xff0c jms消息服务 napoli notify xff0c KV数据库 tair 等 这个框架 工具
  • Android Studio Gradle project Sync Failed解决方法

    1 查看项目使用的gradle和本地gradle是否一致 本地gradle一般目录在C Users admin gradle文件夹下面 项目使用的gradle在项目的gradle wrapper properties文件中 distribu
  • Docker not running on windows 10 error: Hardware assisted virtualization and data execution protecti

    Docker not running on windows 10 error Hardware assisted virtualization and data execution protection must be enabled in
  • [高通SDM450][Android9.0]user版本uartlog常开

    文章目录 开发平台基本信息问题描述解决方法user版本调试串口可输入user版本uartlog常开 开发平台基本信息 芯片 SDM450 版本 Android 9 0 kernel msm 4 9 问题描述 user版本调试串口默认只输入调
  • Ubuntu 7.04 乱码解决

    一 解决XMMS乱码问题 菜单乱码的解决 1 sudo ln s etc gtk gtkrc zh CN etc gtk gtkrc zh CN utf 8 2 sudo gedit etc gtk gtkrc zh CN utf 8 填写
  • yii2连接websocket服务实现服务端主动推送消息给客户端

    上一篇写的是websocket的服务 xff0c 这一篇写写调用服务和web端调用 xff0c 接收消息部分 1 调用websocket服务 主动推送消息的方法 lt php namespace common services use co
  • 生产者消费者算法

    span class hljs comment include lt unistd h gt span span class hljs comment include lt stdlib h gt span span class hljs
  • MongoDB ODM 框架MongoMongo-简化你的数据存储

    MongMongo是一个用Java写的ODM框架 xff0c 使得对MongoDB的操作更加便捷 MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API 并且保留了MongoDB的sche
  • archlinux安装deb软件步骤

    archlinux安装deb软件步骤 步骤 步骤 安装yay安装debtap安装转换出的pkg软件 注意事项 xff1a 安装yay问题解决 xff1a go语言相关安装debtap问题解决 xff1a git代理设置
  • 第六章 正则,BeautifulSoup,xpath

    文章目录 1 正则1 1 提取字符串1 2 替换1 3 搜索 2 beautifulsoup2 1 各种解析器2 2 提取方式2 3 find方法2 3 1 find2 3 2 find all2 3 3 通过id和类型精确定位2 3 3