Python中xPath技术和BeautifulSoup的使用

xpath基本知识

      XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集

                路径表达式

       nodename:表示选取此节点的所有子节点

          /    : 表示从根节点选取

          //   :选择任意位置的某个节点。

           .  :选取当前节点

          ..   :选取当前节点的父节点

          @   :选取属性

                                                 谓语实例

        实现效果                                                                 路劲表达式

选取属于classroom子元素的第一个student元素              /classroom/student[1]

选取属于classroom子元素的最后一个student元素            /classroom/student[last()]

选取属于classroom子元素的倒数第二个stduent元素         /classroom/stduent[last()-1]

选取最前面的两个属于classroom元素的子元素的student元素  /classroom/stduent[position()<3]

选取所有拥有名为lang的属性的name元素                                //name[@lang]

选取所有name元素,且这些元素拥有值为eng的lang属性   //name[@lang='en']

选取classroom元素的所有student元素,且其中的age元素的值须大于20   .classroom.stduent[age>20]

选取classroom元素中的student元素的所有name元素,且其中的age元素的值须大于20   /classroom/stduent[age>20]/name

                                   通配符“*”与“|”操作

         实现效果                                                    路径表达式

选取classroom元素的所有子元素                      /classroom/*

选取文档中的所有元素                                       //*

选取所有带有属性的name元素                          //name[@*]

选取stduent元素的所有name和age元素           //stduent/name | //stduent/age

选取属于classroom元素的student元素的所有name元素,以及文档中所有的age元素             /classroom/stduent/name | //age

  XPath轴                  步的语法为   轴名称:节点测试[谓语]

             轴名称                                                           含义

            child                                           选取当前节点的所有子节点

           parent                                            选取当前节点的父节点

          ancestor                                          选取当前节点的所有先辈(父、祖父等)

          ancestor-or-self                      选取当前节点的所有先辈以及当前节点本身

            descendant                          选取当前节点的所有后代节点

          descendant-or-self              选取当前节点的所有后代节点以及当前节点本身

          preceding                            选取文档中当前节点的开始标记之前的所有节点

          following                                选取文档中当前节点的结束标记之后的所有节点

          preceding-sibling      选取当前节点之前的所有同级节点

          following-sibling           选取当前节点之后的所用同级节点

           self                                 选取当前节点

          attribute                          选取当前节点的所有属性

          namespace                选取当前节点的所有命名空间

                                                  XPath轴示例分析

              实现效果                                                                          路径表达式

 选取当前classroom节点中子元素的teacher节点                            /classroom/child::teacher

选取所有id节点的父节点                                                                  //id/parent::*

选取所有以classid为子节点的祖先节点                                             //classid/ancestor::*

选取classroom节点下的所有后代节点                                               /classroom/descendant::*

选取所有以student为父节点的id元素                                             //student/descendant::id

选取所有classid元素的祖先节点及本身                                             //classid/ancestor-or-self::*

选择/classroom/student本身及其所有后代元素                    /classroom/student/descendant-or-self::*

选取/classroom/teacher之前的所有同级节点,结果就是选所有的student节点   /classroom/teacher/preceding-sibling::*

选取/classroom中第二个stduent之后的所有同级节点            /classroom/student[2]/following-sibling::*

选取/classroom/teacher节点所有之前的节点(除其祖先外),不仅仅是student节点,还有里面的子节点  /classroom/teacher/preceding::*

选取/classroom中第二个student之后的所有节点,结果就是选择了teacher节点及其子节点    /classroom/student[2]/following::*

选取student节点,单独使用没有什么意思            //stduent/self::*

选取/classroom/teacher/name节点下的所有属性        /classroom/teacher/name/attribute::* 

 

                               XPath运算符示例分析

含义                                                                                                       实例

选取classroom元素的所有student元素                   /classroom/student[age=19+1]      /classroom/stduent[age=5*4]   /classroom/student[age=21-1]

且其中的age元素的值须等于20                                                 /classroom/student[age=40div2]

 

类似可以选取  大于、小于、不等于等操作

 

 

or   运算实例        /classroom/stduent[age<20 or age>25]                             .................age小于20或者大于25

and 运算实例        /classroom/stduent[age>20 and age<25]                           ..................age在20 到25 之间                                                             

mod  计算除法的余数     

 

实例代码

复制代码
from lxml import etreecontentStream = open(r'xpathText.xml', 'rb')
content = contentStream.read().decode('utf-8')
root = etree.XML(content)
print(content)
print('-------')
em = root.xpath('/classroom/student[2]/following::*')
print(em[0].xpath('./name/text()'))#获取name标签中文本的内容
print(em[0].xpath('./name/@lang')) #获取name标签中属性名为lang的属性值
复制代码

 

 

BeautifulSoup基础知识

    创建BeautifulSoup对象的两种方式   1.通过字符串创建     soup=BeautifulSoup(htl_str,'lxml')  其中'lxml'表示指定的解析方式

                                                             2.通过文件创建  soup=BeautifulSoup(open('index.html'))

     对象种类  四种  Tag、NavigableString、BeautifulSoup 、Comment

              1)Tag

              在html中每个标签及其里面的内容就是一个Tag对象,如何抽取Tag呢?

               soup.title抽取title     soup.a 抽取a  利用soup+标记名查找的是再内容中第一个符合要求的标记

               Tag中有两个最重要的属性:name和attributes.每个Tag都有自己的名字,通过.name来获取

                               修改Tag的name,修改完成后将影响所有通过当前Beautiful Soup对象生成的HTML文档

复制代码
html_str = """<html>
<head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>
<a href="http://example.com/lacie" class="sister" id="link2">
<!--Lacie -->
</a>
and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.
</p><p class="story">……</p>
</body>
</html>"""
soup = BeautifulSoup(html_str, 'lxml') # soup = BeautifulSoup(open(r'index.html','rb'),'lxml') print(soup.prettify()) #以格式化的形式输出文档的内容 print(soup.name) print(soup.title.name)#输出title的名称 soup.title.name = 'mytitle' #修改title的名称为mytitle print(soup.title) #title已经修改输出None print(soup.mytitle)#输出mytitle Tag
复制代码

 

      输出结果

整个文档的内容
[document]
title
None
<mytitle>The Dormouse's story</mytitle>

 

      获取Tag属性?<p class="title"><b>The Dormouse's story</b></p>Tag p中有一个属性class值为title,获取代码如下:

     
Tag属性值的修改类似于上述标签名的修改    soup.p['class']='myclass' 就把属性值title改为了myclass

# 获取Tag中的属性  和字典类似
print(soup.p['class'])
print(soup.p.get('class'))

 

     输出结果

['title']
['title']

用于获取Tag所有属性的方法  print(soup.p.attrs)以字典的行书获取指定Tag的所有属性:属性值字典

    输出格式如下    

{'class': ['title']}

 

                 2)NavigableString     当已经得到了标记的内容,要想获取标记的内部文字怎么办呢?需要用到.string。

print(soup.b.string)#输出Tag对象b的内容
print(type(soup.b.string))#输出Tage对象b的内容的类型  其实就是NavigableString类型

 

                输出结果

The Dormouse's story
<class 'bs4.element.NavigableString'>

 

       3)Beautiful Soup

        Beautiful Soup对象表示的是一个文档的全部内容。大部分时候,可以把它当作Tag对象,是一个特殊的人Tag,实例如下

print(type(soup.name))
print(soup.name)
print(soup.attrs)

 

 输出结果

<class 'str'>
[document]
{}

 

      4) Comment  文档的注释部分 ,示例如下

print(soup.a.string)
print(type(soup.a.string))

 

 输出结果

Elsie 
<class 'bs4.element.Comment'>

 

 遍历文档

               1)子节点

   Tag中的.contents和.children是非常重要的,都是输出直接子节点,Tag的contents属性可以将Tag子节点以列表的方式输出:

print(soup.html.contents)
print(soup.html.contents[1])#如果soup.html.contents[1].string会直接输出文档里的内容,具体解释看下面

 

  输出结果

复制代码
['\n', <head><mytitle>The Dormouse's story</mytitle></head>, '\n', <body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
<a class="sister" href="http://example.com/lacie" id="link2">
<!--Lacie -->
</a>and<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;and they lived at the bottom of a well.
</p><p class="story">……</p>
</body>, '\n']
<head><mytitle>The Dormouse's story</mytitle></head>
复制代码

 

Tag中children,其实.children返回的是一个生成器,可以对Tag的子节点进行循环

for child in soup.html.children:  # 孩子结点递归循环print(child)

 

输出结果:对于输出换行时,他要空两行,因为print自带换行

复制代码

<head><mytitle>The Dormouse's story</mytitle></head><body> <p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a> <a class="sister" href="http://example.com/lacie" id="link2"> <!--Lacie --> </a>and<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;and they lived at the bottom of a well. </p><p class="story">……</p> </body>

复制代码

 

 .descendants属性可以对所有tag的子孙节点进行递归循环:head中只有一个直接2节点title,但title也包含一个子节点:字符串'The Dormouse's story',

在这种情况下,字符串也属于<head>标记的子孙节点,

for child in soup.head.descendants:  # 子孙节点递归循环print(child)

 

输出结果

<mytitle>The Dormouse's story</mytitle>
The Dormouse's story

 

如何获取标记的内容呢???这就涉及.string、.strings、stripped_strings三个属性

                        .string这个属性很有特点:如果一个标记里面没有标记了,那么.string就会返回标记里面的内容。如果标记里面只有唯一

的一个标记了,那么.string也会返回最里面的内容。如果tag包含多个子节点,tag就无法确定,string方法应该调用哪个子节点的内容,.string的输出结果是None

print(soup.head.string)
print(soup.mytitle.string)
print(soup.html.string)

输出结果

The Dormouse's story
The Dormouse's story
None

 

 .strings属性主要应用于tag中包含多个字符串的情况,可以进行循环遍历

for stri in soup.strings:print(repr(stri))

 

 输出结果

复制代码
'\n'
"The Dormouse's story"
'\n'
'\n'
"The Dormouse's story"
'Once upon a time there were three little sisters; and their names were\n    '
'\n'
'\n'
'\n'
'\n    and\n    '
'Tillie'
';\n    and they lived at the bottom of a well.\n'
'……'
'\n'
'\n'
复制代码

 

    .stripped_strings属性可以去掉输出字符串中包含的空格或换行,示例如下

for stri in soup.stripped_strings:print(repr(stri))

 

         输出结果

复制代码
"The Dormouse's story"
"The Dormouse's story"
'Once upon a time there were three little sisters; and their names were'
'and'
'Tillie'
';\n    and they lived at the bottom of a well.'
'……'
复制代码

 

         2)父节点

   每个Tag或者字符串都有父节点:被包含在某个Tag中。通过.parent可以获取某个元素的父节点

    print soup.mytitle.parent  输出<head><title>........</title></head>

通过元素的.parents属性可以递归得到元素所有父辈节点,使用.parents方法遍历了<a>标记到根节点的所有节点

print(soup.a)
for parent in soup.a.parents:if parent is None:print(parent)else:print(parent.name)

 

输出结果

<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
p
body
html
[document]

 

   3)兄弟节点:可以理解为和本节点出在同一级上的节点,.next_sibling属性可以获取该节点的下一个兄弟节点,.previous_sibling则与之相反,

如果节点不存在,则返回None

 可以通过.next_siblings和.previous_siblings来迭代所有的兄弟节点 

  4)前后节点

前后节点需要使用.next_element、previous_element这两个属性,他针对所有节点,不分层次,例如<head><title>The Dormouse‘s story</title></head>

中的下一个节点是title

如果想遍历所有的前节点或者后节点,通过.next_elements和previous_elements的迭代器就可以向前或向后访问文档的解析内容

for elem in soup.html.next_elements:  #有点像深度优先遍历print(repr(elem))

 

  输出结果

复制代码
'\n'
<head><mytitle>The Dormouse's story</mytitle></head>
<mytitle>The Dormouse's story</mytitle>
"The Dormouse's story"
'\n'
<body>
<p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
<a class="sister" href="http://example.com/lacie" id="link2">
<!--Lacie -->
</a>and<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;and they lived at the bottom of a well.
</p><p class="story">……</p>
</body>
'\n'
<p class="title"><b>The Dormouse's story</b></p>
<b>The Dormouse's story</b>
"The Dormouse's story"
<p class="story">Once upon a time there were three little sisters; and their names were<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
<a class="sister" href="http://example.com/lacie" id="link2">
<!--Lacie -->
</a>and<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;and they lived at the bottom of a well.
</p>
'Once upon a time there were three little sisters; and their names were\n    '
<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
' Elsie '
'\n'
<a class="sister" href="http://example.com/lacie" id="link2">
<!--Lacie -->
</a>
'\n'
'Lacie '
'\n'
'\n    and\n    '
<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
'Tillie'
';\n    and they lived at the bottom of a well.\n'
<p class="story">……</p>
'……'
'\n'
'\n'
复制代码

 

搜索文档

   只介绍find_all()方法,其它方法类似

函数原型

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

1)name参数

name参数可以查找所有名字为name的标记,字符对象会被自动忽略掉。name参数取值可以是字符串、正则表达式、列表、True和方法

       字符串案例 用于查找文档中所有的<b>标记  ,返回值为列表:

print(soup.find_all('b'))
#输出结果
[<b>The Dormouse's story</b>]

 

      传入正则表达式作为参数,会通过正则表达式的match()来匹配内容。下面列出所有以b开头的标记,这表示<body>和<b>标记

for tag in soup.find_all(re.compile('^b')):print(tag.name)
#输出结果
body
b

 

    传入列表

       print(soup.find_all(['a','b']))//找到文档中所有的<a>标记和<b>标记

      传入True,True可以匹配任何值,会查找所有的tag ,但不会返回字符串节点

             

复制代码
for tag in soup.find_all(True):print(tag.name)
#输出结果
html
head
mytitle
body
p
b
p
a
a
a
p
复制代码

 

   如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数Tag节点,如果这个方法返回?True表示当前元素匹配并且被找到

,如果不是则返回False,比如过滤包含class属性,也包含id属性的元素

     

复制代码
def hasClass_Id(tag):return tag.has_attr('class') and tag.has_attr('id')
print(soup.find_all(hasClass_Id))
#输出结果
[<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)kwargs参数

kwargs参数就是python中的keyword参数 ,如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字Tag的属性来搜索

。搜索指定名字的属性时可以使用的参数值包括字符串、正则表达式、列表、True

           传入字符串   print(soup.find_all(id='link2'))  会搜索每个tag的id属性

           传入正则表达式    print(soup.find_all(href=re.compile('elsie')))搜索href属性中含有‘elsie’的tag

          True         print(soup.find_all(id=True))  文档树中查找所有包含id属性的Tag,无论id的值是什么:

       如果想用 class过滤·,但class是python的关键字,需要在class后main加个下划线:

              soup.find_all('a',class_='sister')

      有些tag属性在搜索中不能使用,比如HTML5中的data-*属性   可以通过find_all()方法的attrs参数定义一个字典参数来搜索包含特殊属性的tag

data_soup = BeautifulSoup('<div data-foo="value">foo!</div>', 'lxml')
print(data_soup.find_all(attrs={"data-foo": "value"}))
# data_soup.find_all(data - foo = 'value')  #报错 特殊属性不能这样处理
#输出结果
[<div data-foo="value">foo!</div>]

 

3)text参数

通过text参数可以搜索文档中的字符串内容。与name参数的可选值一样,text参数接受字符、正则表达式、列表、True

print soup.find_all(text=["Tillie", "Elsie", "Lacie"])
print soup.find_all(text=re.compile("Dormouse"))输出结果

[u'Elsie', u'Lacie', u'Tillie']
[u"The Dormouse's story", u"The Dormouse's story"]

  4)limit参数

find_all()方法返回全部的搜索结构,如果文档树很大那么搜索会很慢2.如果我们不需要全部结果,可以使用limit参数限制返回结果的数量

                          soup.find_all('a',limit=2)值返回两条结果

  

5)recursive参数

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

recusive=False

print(soup.find_all('mytitle'))
print(soup.find_all('mytitle', recursive=False))
#输出结果
[<mytitle>The Dormouse's story</mytitle>]
[]

转载于:https://www.cnblogs.com/mnzht/p/9009753.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

div水平垂直居中的六种方法

在平时&#xff0c;我们经常会碰到让一个div框针对某个模块上下左右都居中&#xff08;水平垂直居中&#xff09;&#xff0c;其实针对这种情况&#xff0c;我们有多种方法实现。 方法一: 绝对定位方法&#xff1a;不确定当前div的宽度和高度&#xff0c;采用 transform: trans…

Redis集群监控及Redis桌面客户端

之前在生产环境部署了Redis集群&#xff0c;一直苦于没有工具监控&#xff0c;最近找了下网上推荐redmon和Redislive的比较多&#xff0c;查看了两个项目的github,都几年没有更新&#xff0c;这两个项目应该没有人在维护了&#xff0c;如果哪位有更好的替代方案麻烦告知&#x…

GIT安装部署

git git简介 Git不仅是一款开源的分布式版本控制系统&#xff0c;而且有其独特的功能特性&#xff0c;例如大多数的分布式版本控制系统只会记录每次文件的变化&#xff0c;说白了就是只会关心文件的内容变化差异&#xff0c;而Git则是关注于文件数据整体的变化&#xff0c;直接…

牛客网Wannafly挑战赛15 B车辆安排(模拟)AND C 出队(规律)

传送门 &#xff1a;B题&#xff1a;点我 C题&#xff1a; 点我 题目描述 有n个队伍&#xff0c;每个队伍的人数小于等于5&#xff0c;每辆车最多坐5个人&#xff0c;要求一个队伍的人都在一辆车上&#xff0c;求最少的车数 输入描述: 第一行n第二行n个数&#xff0c;表示每个队…

5-12

1,每个递归函数都有两部分&#xff0c;基线条件和递归条件 base case and recursive case 2,调用一个函数的时候&#xff0c;其他的函数调用会暂停并处于未完成的状态 3.调用栈会消耗大量的内存&#xff0c;栈很高的时候意味着计算机要存储大量的函数调用信息&#xff0c;此时的…

Team Foundation Server (TFS) 2015 安装指导

原文地址&#xff1a;http://www.cnblogs.com/danzhang/p/4718035.html http://www.cnblogs.com/danzhang 张洪君 微软ALM MVP 1. 概述 微软于8月6日发布了大家期待已久的TFS 2015正式版&#xff0c; https://www.visualstudio.com/en-us/news/tfs2015-vs.aspx &#xff0c;…

VM虚拟机链接克隆及linux eth0网卡的快速设置方法

对于后台开发者来说,在学习过程中必然接触众多中间件,在自己的虚拟机进行操作甚至搭建cluster是很常见的事情.我在初学者时摸索出一套快速的克隆虚拟机方法.分享给大家.产品VMware Workstation版本10.0.2 build-1744117这是我的虚拟机命名,我觉得这样的命名比较合适,clone机/服…

Spring MVC+Mybatis 多数据源配置

文章来自&#xff1a;https://www.jianshu.com/p/fddcc1a6b2d8 1. 继承AbstractRoutingDataSource AbstractRoutingDataSource 是spring提供的一个多数据源抽象类。spring会在使用事务的地方来调用此类的determineCurrentLookupKey()方法来获取数据源的key值。我们继承此抽象类…

围观神龙架构首次开箱,现场直播暴力拆机

围观神龙架构首次开箱&#xff0c;现场直播暴力拆机 发布时间&#xff1a;2018-05-16 13:43:01686人关注34人参与阿里云X-Dragon大事记2017年4月&#xff1a;阿里云X-Dragon项目立项&#xff1b;2017年10月&#xff1a;阿里云正式推出基于X-Dragon架构的弹性裸金属服务器&#…

windows-server-2012R2离线中文语言包安装

1、离线包下载地址http://download.csdn.net/detail/github_38358734/9858412 2、安装方法&#xff1a; 解压离线包 Dism /online /Add-Package /PackagePath:C:\test\LangPacks\lp.cab 大概10分钟&#xff0c;完成。 然后重启电脑&#xff0c;到控制面板语言区域选项&…

文字闪烁效果

效果图&#xff1a; HTML Code: <a class"blink" href"#" target"_blank"> 扁平化设计看上去非常简单、直观扁平化设计看上去非常简单、直去非化设计看上去非常简单、直观扁平化设计看上去非常简单、直观扁平常简单</a> JQuery Code…

BZOJ 3295: [Cqoi2011]动态逆序对 cdq分治

https://www.lydsy.com/JudgeOnline/problem.php?id3295 这个妹妹我曾见过的~~~ 之前应该在校内oj写了&#xff0c;似乎还写过题解&#xff1f;发现没写博客就重新水一遍代码水一篇博客好了。 把找逆序对的过程想成一个一个往里塞数字然后找每个数字可以组成的逆序对&#xff…

p1、查询端口号占用,根据端口查看进程信息/p

2017年6月份的时候&#xff0c;我就着手在公司推广git&#xff0c;首先我自己尝试搭建了GitLab来管理代码&#xff0c;并且通过以下博客记录了GitLab的搭建&#xff0c;以及GitLab备份&#xff0c;GitLab升级等事情。 git学习——>在CenterOS系统上安装GitLab并自定义域名访…

point-position2修改版

说明&#xff1a; 在共面直线测试中&#xff0c;由于计算误差等原因&#xff0c;共面条件判断不准&#xff0c;但计算结果依然正确。 // point-position2.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <stdio.h> #include <iostream&g…

Linux学习总结(十六)系统用户及用户组管理

先来认识两个文件/etc/passwd/etc/shadow我们打印出首尾三行&#xff0c;来了解下&#xff1a;每行由&#xff1a;分割为7段&#xff0c;每段含义为&#xff1a;第一段&#xff1a;用户名&#xff0c;比如root 用户&#xff0c;普通用户test,lv,test1第二段&#xff1a;早期存放…

hadoop综合大作业

Hadoop综合大作业 要求&#xff1a; 1.用Hive对爬虫大作业产生的文本文件&#xff08;或者英文词频统计下载的英文长篇小说&#xff09;词频统计。 词频统计的截图如下&#xff1a; 上次我所使用的文章是一篇中文文章&#xff0c;所以这次我用了一篇英文文档来进行分词&#xf…

MPI对道路车辆情况的Nagel-Schreckenberg 模型进行蒙特卡洛模拟

平台Ubuntu 16.04&#xff0c;Linux下MPI环境的安装见链接&#xff1a;https://blog.csdn.net/lusongno1/article/details/61709460据 Nagel-Schreckenberg 模型&#xff0c;车辆的运动满足以下规则&#xff1a;1. 假设当前速度是 v &#xff0c;和前一辆车的距离为d。2. 如…

Android 中.aar文件生成方法与用法

https://i.cnblogs.com/EditPosts.aspx?opt1 无论是用Eclipse还是用Android Studio做android开发&#xff0c;都会接触到jar包&#xff0c;全称应该是&#xff1a;Java Archive&#xff0c;即java归档文件。在用AS的过程中&#xff0c;你会发现有aar这么个东西&#xff0c;经查…

windows10上安装mysql

环境&#xff1a;windwos 10&#xff08;1511&#xff09; 64bit、mysql 5.7.14 一、下载mysql1. 在浏览器里打开mysql的官网http://www.mysql.com/2. 进入页面顶部的"Downloads"3. 打开页面底部的“Community(GPL) Downloads” 4. 在页面中间的位置找到我们windows上…

sql server 内存初探

sql server 内存初探 原文:sql server 内存初探一. 前言 对于sql server 这个产品来说&#xff0c;内存这块是最重要的一个资源&#xff0c; 当我们新建一个会话&#xff0c;相同的sql语句查询第二次查询时间往往会比第一次快&#xff0c;特别是在sql统计或大量查询数据输出时&…