Python网络爬虫学习笔记(四)解析库的使用

2023-10-31

解析库的使用

使用正则表达式,比较烦琐,而且万一有地方写错了,可能导致匹配失败。
对于网页的节点来说,有 id 、 class 或其他属性。 而且节点之间还有层次关系,在网页中可以通过 XPath 或 css 选择器来定位一个或多个节点 。 利用 XPath 或 css选择器来提取某个节点,然后再调用相应方法获取它的正文内容或者属性。
在 Python 中,有 lxml 、Beautiful Soup 、 pyquery 等解析库实现这个操作。

使用 XPath

XPath , 全称 XML Path Language ,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言 。
1. XPath 概览
XPath 提供了非常简洁明了的路径选择表达式,还提供了超过
100 个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等 。 几乎所有我们想要定位的节点,都可以用 XPath 来选择。
使用之前,首先要确保安装好 lxml 库
官方网站 : https://www.w3.org/TR/xpath

2. XPath 常用规则
在这里插入图片描述
例子:
//title[@lang=‘eng’]
代表选择所有名称为 title ,同时属性 lang 的值为 eng 的节点

实例引入

from lxml import etree
#一段 HTML 文本
text = '''		
<div>
<ul>
<li class="item-O"><a href="linkl.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a> 
</ul>
</div>
'''
#最后一个 li 节点是没有闭合的
html = etree.HTML(text) #调用 HTML 类进行初始化
result= etree.tostring(html)
print(result.decode('utf-8'))

调用 tostring ()方法即可输出修正后的 HTML 代码,但是结果是 bytes 类型 。 利用decode ()方法将其转成 str 类型,经过处理之后, li 节点标签被补全,并且还向动添加了 body 、 html 节点 。
运行结果:
在这里插入图片描述
也可以直接读取文本文件进行解析:

#输出结果略有不同,多了一个 DOCTYPE 的声明
html = etree.parse('. /test. html', etree.HTMLParser())
result= etree.tostring(html)

3.所有节点
用//开头的 XPath 规则来选取所有符合要求的节点

result = html.xpath('//*')

运行结果:
在这里插入图片描述
*代表匹配所有节点,也就是整个 HTML 文本中的所有节点都会被获取,返回形式是一个列表,每个元素是 Element 类型,其后跟了节点的名称,如 html 、 body 、 div 、 ul 、 li 、a等。
如果想获取所有 li 节点:

result = html.xpath('//li')
print(result)
print(result[0])

运行结果:
在这里插入图片描述
4. 子节点
通过 / 或 // 即可查找元素的子节点或子孙节点
其中/用于获取直接子节点,// 用于获取子孙节点

#选择 li 节点的所有直接 a 子节点
result = html.xpath('//li/a')

#取 ul 节点下的所有子孙 a 节点
result = html.xpath('//ul//a')

5.父节点
查找父节点可以用 … 来实现,也可以通过 parent ::来获取父节点

#选中 href 属性为 link4.html 的 a 节点,然后再获取其父节点,然后再获取其 class属性
result = html.xpath('//a[@href="link4.html"]/../@class')
result = html.xpath('//a[@href="link4.html"]/parent::*/@class')

6…属性匹配
可以用@符号进行属性过滤

#限制了节点的 class 属性为 item-0
result = html.xpath('//li[@class = "item-0"]')

7.文本获取
XPath 中的 text( )方法可获取节点中的文本

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

没有获取到任何文本,只获取到了一个换行符:
因为 XPath 中text ()前面是/,而此处/的含义是选取直接子节点,很明显 l i 的直接子节点都是 a 节点,文本都是在a节点内部的,所以这里匹配到的结果就是被修正的li节点内部的换行符。
想获取 li 节点内部的文本,就有两种方式,一种是先选取 a 节点再获取文本,另一种就是使用 //

result1 = html.xpath('//li[@class = "item-0"]/a/text()')
result2 = html.xpath('//li[@class = "item-0"]//text()')
print(result1)
print(result2)

运行结果:
在这里插入图片描述
如果要想获取子孙节点内部的所有文本,可以直接用 //加 text( )的方式,这样可以保证获取到最全面的文本信息,但是可能会夹杂一些换行符等特殊字符。 如果想获取某些特定子孙节点下的所有文本,可以先选取到特定的子孙节点,然后再调用 text( )方法获取其内部文本,这样可以保证获取的结果是整洁的 。

8.属性获取
通过@href 即可获取节点的 href 属性
和属性匹配的方法不同,属性匹配是中括号加属性名和值来限定某个属性,如[@href="linkl.html”],而此处的@href 指的是获取节点的某个属性

result = html.xpath('//li/a/@href')

运行结果:
在这里插入图片描述
9.属性多值匹配
如果HTML 文本中 li 节点的 class 属性有两个值 li 和 li-first,此时如果还用之前的属性匹配获取,就无法匹配
这时就需要用 contains( )函数,第一个参数传人属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配了 。

result = html.xpath('//li[contains(@class,"li")]/a/text()')

10.多属性匹配
是根据多个属性确定一个节点,这时就需要同时匹配多个属性。 此时可以使用运算符 and 来连接:

result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')

同时根据 clas s 和 name 属性来选择,一个条件是 class 属性里面包含 li 字符串,另一个条件是 name 属性为 item 字符串,二者需要同时满足,用 and 操作符相连,相连之后置于中括号内进行条件筛选
在这里插入图片描述
11.按序选择
可以利用中括号传入索引的方法获取特定次序的节点

#选取第一个 li 节点,中括号中传入数字 l 
result = html.xpath('//li[l]/a/text()')

#选取最后一个 li 节点,中括号中传入 last()
result = html.xpath ('//li[last()]/a/text()')

#选取位置小于 3 的 li 节点
result = html.xpath('//li[position()<3]/a/text ()')

#选取倒数第三个 li 节点,中括号中传入 last()-2 
result = html.xpath('//li[last()-2]/a/text()')

在 XPath 中,提供了 100 多个函数,包括存取 、 数值、字符串、逻辑、节点、序列等处理功能,它们的具体作用可以参考: http://www.w3school.com.cn/xpath/xpath_functions.asp

12. 节点轴选择
XPath 提供了很多节点轴选择方法,包括获取子元素 、兄弟元素、父元素、祖先元素等

#调用ancestor 轴,可以获取所有祖先节点
result = html.xpath('//li[l]/ancestor::*')

#在冒号后面加了 div,得到的结果就只有 div 这个祖先节点
result = html.xpath('//li[l]/ancestor::div')

#调用了 attribute 轴,可以获取所有属性值,其后跟的选择器还是*,代表获取节点的所有属性,返回值就是 li 节点的所有属性值
result = html.xpath('//li[1]/attribute::*')

#调用了 child 轴,可以获取所有直接子节点,当前选取 href 属性为 linkl.html 的 a 节点
result= html.xpath('//li[1]/child::a[@href="linkl.html"]')

#调用了 descendant 轴,可以获取所有子孙节点,当前获取只包含 span 节点而不包含 a 节点 
result = html.xpath('li[l]/descendant::span')

#调用了 following 轴,可以获取当前节点之后的所有节点,当前只获取了第二个后续节点
result = html.xpath('//li[1]/following::*(2]')

#调用 了 following-sibling 轴 ,可以获取当前节点之后的所有同级节点,当前获取了所有后续同级节点
result = html.xpath('//li[1]/following-sibling::*')

更多 XPath 的用法,可以查看http://www.w3school.com.cn/xpath/index.asp
更多 .Python lxml 库的用法,可以查看 http://lxml.de/

使用 Beautiful Soup

Beautiful Soup 提供一些简 单的、 Python 式的 函数来处理导航、搜索、修改分析树等功能 。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序 。
Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 UTF-8 编码 ,不需要考虑编码方式。

1.解析器
在这里插入图片描述
2. 基本用法

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>Hello</p>','lxml')
print (soup.prettify())
print(soup.p.string)

运行结果:
在这里插入图片描述
调用 prettify( )方法可以把要解析的字符串以标准的缩进格式输出,
对于不标准的 HTML 字符串 ,Beautifol Soup可以自动更正格式,在初始化 Beautifol Soup 时就完成了 。
soup.p.string可以选出 HTML 中的 p 节点,再调用 string 属性就可以得到里面的文本。

3.节点选择器
直接调用节点的名称就可以选择节点元素,再调用 string 属性就可以得到节点内的文本了
·选择元素
例子:

from bs4 import BeautifulSoup
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse" ><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 =" linkl " >< ! ... Else ... ></a>
<a href = "http://example.com/eacie" 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>
"""

soup = BeautifulSoup(html,'lxml')
print(soup.title)
print(type(soup.title))#经过选择器选择后,选择结果都是Tag 类型 
print(soup.title.string)#Tag 具有一些属性,比如 string,调用该属性,可以得到节点的文本内容
print(soup.head )
print(soup.p)

运行结果:
在这里插入图片描述
最后一个输出结果是第一个 p 节点的内容,后面的几个 p 节点并没有选到。所以,当有多个节点时,这种选择方式只会选择到第一个匹配的节点,其他的后面节点都会忽略。

·提取信息
(1)获取名称
可以利用 name 属性获取节点的名称 。

print(soup.title.name)

在这里插入图片描述
(2)获取属性
每个节点可能有多个属性,比如 id 和 class 等,选择这个节点元素后,可以调用 attrs 获取所有属性:

print(soup.p.attrs)
print(soup.p.attrs['name'])

在这里插入图片描述
attrs 的返回结果是字典形式,把选择的节点的所有属性和属性值组合成一个字典。
可以不用写 attrs ,直接在节点元素后面加中括号,传入属性名就可以获取属性值了。

print(soup.p['name'])
print(soup.p['class'])

在这里插入图片描述
根据属性的值是否唯一,有的返回结果是字符串,有的返回结果是字符串组成的列表。 对于 class , 一个节点元素可能有多个 class , 所以返回的是列表。

(3)获取内容
·嵌套选择
在 Tag 类型的基础上再次选择得到的依然还是 Tag 类型,每次返回的结果都相同,所以可以做嵌套选择 。

print(soup.head.title)
print(type(soup.head.title))
print(soup.head.title.string)

在这里插入图片描述
·关联选择
在做选择的时候,有时候不能做到一步就选到想要的节点元素,需要先选中某一个节点元素,然后以它为基准再选择它的子节点、父节点、 兄弟节点等。
(1)子节点和子孙节点
选取节点元素之后,如果想要获取它的直接子节点,可以调用 cont ents 属性

print(soup.p.contents) 

返回结果是列表形式,若该节点里既包含文本,又包含节点,最后会将它们以列表形式统一返回 。
注意:列表中的每个元素都是 p 节点的直接子节点。若直接子节点例包含子节点,返回结果不会把子孙节点选出来。
在这里插入图片描述
调用 children 属性得到相应的结果:

print(soup.body.children)
for i, child in enumerate(soup.body.children):
    print(i, child)

运行结果:
在这里插入图片描述
调用了 children 属性来选择,返回结果是生成器类型

要得到所有的子孙节点的话,可以调用 descendants 属性 :

print(soup.body. descendants)
for i, child in enumerate(soup.body. descendants):
    print(i, child)

在这里插入图片描述
(2)父节点和祖先节点
如果要获取某个节点元素的父节点,可以调用 parent 属性:

print(soup.a.parent)

在这里插入图片描述
这里输出的仅仅是 a 节点的直接父节点,而没有再向外寻找父节点的祖先节点 。如果想获取所有的祖先节点,可以调用 parents 属性 :

print(type(soup.a.parents))
print(list(enumerate(soup.a.parents)))

在这里插入图片描述
返回结果是生成器类型
(3)兄弟节点
next_sibling 和 previous_sibling 分别获取节点的下一个和上一个兄弟元素, next_siblings 和 previous_siblings 则分别返回所有前面和后面的兄弟节点的生成器

print(' next_sibling  ',soup.a.next_sibling )
print(' previous_sibling  ',soup.a.previous_sibling)
print(' next_siblings ',list(enumerate(soup.a.next_siblings)))
print(' previous_siblings  ',list(enumerate(soup.a.previous_siblings)))

在这里插入图片描述
(4)提取信息

print(soup.a.next_sibling.string)
print(list(soup.a.parents)[o].attrs['class'])

如果返回结果是单个节点,那么可以直接调用 string 、 attrs 等属性获得其文本和属性;如果返回结果是多个节点的生成器,则可以转为列表后取出某个元素,然后再调用 string 、 attrs 等属性获取其对应节点的文本和属性。
4.方法选择器
Beautifu l Soup 还提供了一些查询方法,比如 find_all()和 find ()等 ,调用它们,然后传入相应的参数,就可以灵活查询了。
• find_all()
查询所有符合条件的元素,给它传入一些属性或文本,就可以得到符
合条件的元素。
API 如下:
find_all(narne, attrs, recursive, text, **kwargs)
(l) name:根据节点名来查询元素

print(soup.find_all(name='p'))
print(type(soup.find_all(name='p')[0]))

在这里插入图片描述
调用 find_all ()方法,返回结果是列表类型,每个元素依然都是 bs4.element.Tag 类型,所以依然可以进行嵌套查询,可以再继续查询其内部的节点。

for p in soup.find_all(name = 'p'):
    print (p.find_all(name='a'))

在这里插入图片描述
(2) attrs

print(soup.find_all(attrs = {'id''list-1'})
print(soup.find_all(attrs  = {'name''elements'})

对于一些常用的属性,比如 id 和 ιlass 等, 我们可以不用 attrs 来传递。 比如,要查询 id 为 list-1的节点,可以直接传人 id 这个参数。

print(soup.find_all(id='list-1'))
print(soup.find_all(class = 'element'))

(3) text
text 参数可用来匹配节点的文本 ,传入的形式可以是字符串,可以是正则表达式对象。

print(soup.find_all(text=re.compile('link')))
#结果返回所有匹配正则表达式的节点文本组成的列表

• find{)
与find_all( )方法比较,find()方法返回的是单个元素,即第一个匹配的元素。

print(soup.find(name = 'p'))
print(type(soup.find(name = 'p')))
print(soup.find(class_= 'list' ))

在这里插入图片描述

还有许多查询方法:
口 fiind_parents( )和 find_parent( ): 前者返回所有祖先节点 , 后者返回直接父节点。
口 find_next_siblings( )和 find_next_sibling( ): 前者返回后面所有的兄弟节点 , 后者返回后面第一个兄弟节点 。
口 find_previous_siblings( )和 find_previous_sibling( ): 前者返回前面所有的兄弟节点 , 后者返回前面第一个兄弟节点 。
口 find_all_next( )和 find_next( ): 前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点 。
口 find_all_previous( )和 find_previous( ):前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点 。

5.css 选择器
css官方文档地址: http://www.w3school.com.cn/cssref/css_selectors.asp
使用 css 选择器时,只需要调用 select( )方法,传人相应的 css 选择器即可。
例子:

from bs4 import BeautifulSoup
html = """
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element"> Foo</li>
<li class="element">Bar</li>
<li class="element">]ay</li>
</ul>
<Ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
"""
soup = BeautifulSoup(html,'lxml')
print (soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))

在这里插入图片描述
·嵌套选择

for ul in soup.select('ul'):
    print(ul.select('li'))

在这里插入图片描述
• 获取属性

直接传入中括号和属性名,以及通过 attrs 属性获取属性值,都可以成功 。

for ul in soup.select('ul'):
	print(ul['id'])
	print (ul.attrs['id'])

在这里插入图片描述

·获取文本

要获取文本,可以用 string 属性,还有一个方法就是 get_text()

for li in soup.select('li') :
    print('Get Text:',li.get_text())
    print('String:', li.string)

在这里插入图片描述

小总结:
1.推荐使用 lxml 解析库,必要时使用 html.parser。
2.节点选择筛选功能弱但是速度快 。
3.建议使用 find( )或者 find_all( )查询匹配单个结果或者多个结果 。
4.如果对 css 选择器熟悉的话,可以使用 select( )方法选择 。

使用 pyquery

如果比较熟悉css 选择器和jQuery,可以使用解析库一pyquery。

1.初始化
初始化 pyquery 的时候,需要传入 HTML 文本来初始化一个 PyQuery对象。 它的初始化方式有多种,比如直接传入字符串,传入 URL ,传人文件名,等等。
•字符串初始化

html = """
<div>
<ul>
<li class="item-O">first item</li>
<li class="item-1"><a herf = "link2.html"> second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class = cold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="links.html">fifth item</a></li>
</ul>
</div>
"""
from pyquery import PyQuery as pq  #引人 PyQuery 这个对象,取别名为 pq

#字符串当作参数传递给 PyQuery 类,完成了初始化
doc = pq(html)
print (doc('li'))

•URL 初始化

doc = pq(url='https://weibo.com')
print(doc('title'))

doc = pq(requests.get('https://weibo.com').text)#功能与上面相同
print(doc('title'))

在这里插入图片描述
•文件初始化
除了传递 URL ,还可以传递本地的文件名, 将参数指定为 filename 即可:

 doc = pq(filename='demo.html')

2.基本 css 选择器

html = """
<div id="container">
<ul class="list">
<li class="item-O">first item</li>
<li class="item-1"><a herf = "link2.html"> second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class = cold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="links.html">fifth item</a></li>
</ul>
</div>
"""
from pyquery import PyQuery as pq
import requests
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))

在这里插入图片描述

css 选择器#container .list li 的意思是先选取 id 为 container 的节点,然后再选取其内部的 class 为 list 的节点内部的所有 li 节点,然后,打印输出 ,它的类型依然是 PyQuery 类型。

3.查找节点
一些常用的查询函数和 jQuery 中函数的用法完全相同 。
·子节点
查找子节点时 , 需要用到find( )方法,传人的参数是 css 选择器。
find( )方法会将符合条件的所有节点选择出来,结果的类型是PyQuery 类型 。find( )的查找范围是节点的所有子孙节点,而如果只想查找子节点,那么可以用children( )方法。

items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)

在这里插入图片描述

lis = items.children('li')
print(type(lis))
print(lis)

在这里插入图片描述

如果要筛选所有子节点中符合条件的节点,比如想筛选出子节点中 class 为 active 的节点,可以向 children()方法传入 css 选择器 .active:

lis = items.children('.active')
print(lis)

在这里插入图片描述
·父节点

#这里的父节点是该节点的直接父节点,
container = items.parent()
print(type(container))
print(container)

在这里插入图片描述
祖先节点:parents( )方法
·兄弟节点
siblings( )方法
如果要筛选某个兄弟节点,我们依然可以向 siblings 方法传入 css 选择器

4.遍历
对于多个节点的结果,就需要遍历来获取,可调用 items( )方法得到一个生成器,遍历一下,就可以逐个得到节点对象:

lis = doc('li').items()
print(type(lis))
for li in lis:
	print(li, type(li))

在这里插入图片描述

5.获取信息
比较重要的信息有两类, 一是获取属性,二是获取文本。
·获取属性
以调用 attr( )方法来获取属性:

a = doc(' .item-0.active a')
print(a, type(a))
print(a.attr('href'))
#也可以通过调用 attr 属性来获取属性
print(a.attr.href)

在这里插入图片描述
当返回结果包含多个节点时,调用 attr()方法,只会得到第一个节点的属性。遇到这种情况时,如果想获取所有的 a 节点的属性,就要遍历 :

a = doc('a')
for item in a.items() :
	print(item.attr('href'))

在这里插入图片描述
·获取文本
可以调用 text( )方法以获取其内部的文本信息 ,此时会忽略掉节点内部包含的所有 HTML,只返回纯文字内容。
html( )方法可以获取这个节点内部的 HTML 文本。
html( )方法返回的是第一个节点的内部 HTML 文本,而 text( )则返回了所有的节点内部的纯文本。

6.节点操作
pyquery 提供了一系列方法来对节点进行动态修改,比如为某个节点添加一个 class ,移除某个节点等。
例子:
• addClass 和 removeClass

li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)

首先选中了第三个 li 节点,然后调用 removeClass( )方法,将 li 节点的active 这个 class 移除,后来又调用 addClass( )方法,将 class 添加回来。
在这里插入图片描述
• attr 、 text 和 html
除了操作 class 这个属性外,也可以用 attr( )方法对属性进行操作 。还可以用 text()和 html( )方法来改变节点内部的内容。

li = doc('.item-0.active')
print(li)
li.attr('name','link1')
print(li)
li.text('changed item')
print(li)
li.html('<span>changed item</span>')
print(li)

在这里插入图片描述
因此 attr( )方法只传入第一个参数的属性名,则是获取这个属性值 ; 如果传入第二个参数,可以用来修改属性值。 text( )和 html( )方法如果不传参数 ,则是获取节点内纯文本和 HTML 文本;如果传人参数 ,则进行赋值。

• remove()
remove( )方法就是移除

li = doc('.item-0')
print(li)
li.find('span').remove()
print(li)

在这里插入图片描述
还有很多节点操作的方法,比如 append ( )、 empty( )和 prepend( )等方法,它们和 jQuery的用法完全一致,详细的用法可以参考官方文档: http://pyquery.readthedocs.io/en/latest/api.html

7.伪类选择器
CSS3 的伪类选择器功能强大
例如选择第一个节点、最后一个节点、奇偶数节点、包含某一文本的节点等

li = doc('li:first-child')#第一个 li 节点
print(li)
li = doc('li:last-child')#最后一个 li 节点
print(li)
li = doc('li:nth-child(2)')#第二个 li节点
print(li)
li = doc('li:gt(2)')#第三个 li 之后的 li 节点
print(li)
li = doc('li:nth-child(2n)')#偶数位置的 li 节点
print(li)
li = doc('li:contains(second)')#
print(li)

关于 css 选择器的更多用法,可以参考 http://www.w3school.com.cn/css/index.asp
pyquery 的官方文档: http://pyquery.readthedocs.io

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

Python网络爬虫学习笔记(四)解析库的使用 的相关文章

  • 如何恢复tensorflow inceptions检查点文件(ckpt)?

    I have inception resnet v2 2016 08 30 ckpt文件是预先训练的初始模型 我想使用恢复这个模型 saver restore sess ckpt filename 但为此 我将需要编写训练该模型时使用的变量
  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • Pycharm 在 os.path 连接上出现“未解析的引用”

    将pycharm升级到2018 1 并将python升级到3 6 5后 pycharm报告 未解析的引用 join 最新版本的 pycharm 不会显示以下行的任何警告 from os path import join expanduser
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • 如何使用 Python 3 检查目录是否包含文件

    我到处寻找这个答案但找不到 我正在尝试编写一个脚本来搜索特定的子文件夹 然后检查它是否包含任何文件 如果包含 则写出该文件夹的路径 我已经弄清楚了子文件夹搜索部分 但检查文件却难倒了我 我发现了有关如何检查文件夹是否为空的多个建议 并且我尝
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 如何使用 AWS Lambda Python 读取 AWS S3 存储的 Word 文档(.doc 和 .docx)文件内容?

    我的场景是 我尝试使用 python 实现从 Aws Lambda 读取 AWS 存储的 S3 word 文档 doc 和 docx 文件内容 下面的代码是我使用的 我的问题是我可以获取文件名 但无法读取内容 def lambda hand
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 如何使用 PrimaryKeyRelatedField 更新多对多关系上的类别

    Django Rest 框架有一个主键相关字段 http www django rest framework org api guide relations primarykeyrelatedfield其中列出了我的 IDmany to m
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • Python数据分析之特征工程

    目录 一 数据清洗 1 数据样本采集 抽样 2 异常值处理 识别异常值和重复值 直接丢弃 包括重复数据 集中值指代 除异常值外的均值 中位数 众数等等 插值 根据不同特征值的具体形式处理 二 特征预处理 1 特征选择 剔除与标注不相关或者冗
  • 谷歌浏览器旧版本下载地址

    谷歌浏览器下载地址 http www chromedownloads net django API学习 地址 https github com LABELNET django mysite frist django API学习 CSDN博客
  • pythonseleniumAPI

    一 浏览器操作 1 浏览器最大化 driver maximize window 将浏览器最大化显示 2 设置浏览器宽 高 driver set window size 480 800 设置浏览器宽480 高800显示 3 控制浏览器前进 后
  • Mac上配置python3的环境变量

    1 查看当前python3的位置 which python3 我的电脑当前地址路径是 usr local bin python3 2 准备好环境变量的配置内容 PATH usr local bin PATH export PATH alia
  • python开篇-------python介绍

    一 python介绍 python的创始人为吉多 范罗苏姆 Guido van Rossum 1989年的圣诞节期间 Guido开始写Python语言的编译器 Python这个名字 来自Guido所挚爱的电视剧Monty Python s
  • swap 空间去哪里了?

    问题背景 xxxx 项目中 在内存充足的情况下 swap 被使用 需要优化并释放 问题分析过程 内核参数没有配置 vm swappiness 0 0表示最大限度使用物理内存 其次才是 swap 空间 默认值应该是60 100表示积极的使用
  • 2. 快速了解前端三大件(HTML、CSS、Javascript)

    2 1 Web开发的标准 Web应用开发需要遵循的标准就教Web标准 这里Web标准是一系列标准的集合 网页主要由三部分组成 结构标准 XML HTML和XHTML 表现标准 CSS 行为标准 DOM Javascript 2 2 HTML
  • 正则表达式(详解)

    文章目录 1 基本匹配 1 1 标志 大小写i 全局g 多行m 1 2 零宽度断言 前后预查 1 4 贪婪匹配与惰性匹配 Greedy vs lazy matching 2 常见语法 表格 2 1 元字符 2 2 特殊符号 2 3 扩展表示
  • ARM指令集

    往期推荐 ARM汇编语言程序结构 Android与ARM处理器 反射调用Java层方法 反射获取Java层字段的值 ARM指令集是指计算机ARM操作指令系统 在ARM中有两种方式可以实现程序的跳转 一种是跳转指令 另一种是直接向PC寄存器中
  • 构建LAMP网站服务 第一步 编译安装httpd服务器

    构建LAMP网站服务 第一步 编译安装httpd服务器 1 安装前准备 2 编译安装apr 3 编译安装expat 4 编译安装apr util 5 编译安装pcre 6 编译安装httpd 7 selinux配置 8 防火墙配置 9 修改
  • 【编程规范】一文讲解开发中的异常日志

    异常日志规范 在处理异常 日志的时候 遵守一些规范可以避免很多问题 异常处理 强制 Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避 而不应该通过 catch 来处理 比如 IndexOutOfBoun
  • 设置物体的位置 localPosition的用法

    设置物体的位置 m obstacle 0 transform localPosition new Vector3 8 4f 9 18f 9 26f
  • linux、windows命令行设置环境变量(增删改查)

    linux windows命令行设置环境变量 增删改查 1 windows下设置环境变量 1 1 环境变量优先级 1 2 查看环境变量 1 3 设置或修改环境变量 1 4 删除环境变量 1 5 给系统变量追加内容 2 linux下设置环境变
  • 深入剖析HTTP和HTTPS代理在爬虫中的应用价值

    目录 什么是HTTP和HTTPS代理 HTTP和HTTPS代理如何运作 HTTP代理的工作流程如下 HTTPS代理工作流程 网络爬虫使用HTTP代理的好处 网络爬虫使用HTTPS代理的好处 代码示例 总结 在当今互联网时代 网络爬虫作为一种
  • 使用深度学习打造智能聊天机器人

    版权声明 可以任意转载 转载时请标明文章原始出处和作者信息 author 张俊林 聊天机器人 也可以称为语音助手 聊天助手 对话机器人等 是目前非常热的一个人工智能研发与产品方向 很多大的互联网公司重金投入研发相关技术 并陆续推出了相关产品
  • 别逗了!知识付费能支撑起喜马拉雅的200亿估值?

    近日 据消息称喜马拉雅FM已经完成VIE架构搭建 并已完成新一轮4 6亿美元融资 投资方包括春华资本 腾讯 泛大西洋投资 华泰证券 高盛和新天域 投后估值34亿美元 将于明年上半年赴美IPO 对于半年多次传出要上市的喜马拉雅 此时官方并没有
  • YOLOV8改进:更换PoolFormer主干网络

    1 该文章属于YOLOV5 YOLOV7 YOLOV8改进专栏 包含大量的改进方式 主要以2023年的最新文章和2022年的文章提出改进方式 2 提供更加详细的改进方法 如将注意力机制添加到网络的不同位置 便于做实验 也可以当做论文的创新点
  • Linux操作系统简介

    文章目录 Linux发行版简介 学习Linux的必备硬件知识 关键硬件器件 CPU 关键硬件器件 存储 关键硬件器件 内存 其他一些查看硬件信息的命令 Linux开机过程 以Ubuntu16 04为例 阶段1 BIOS 阶段2 boot L
  • 技术人修炼之道阅读笔记(一)让自己更值钱的5个能力

    如何让自己更值钱 回答这个问题 需要使用黄金圈理论 黄金圈理论是一种由内而外的思维模式 提倡 why 为什么这么做 how 如何做 what 做什么 三个圈来思考或决策 首先是 why 你因为什么而值钱 要值钱 就要时刻保持稀缺性 别人不会
  • Python网络爬虫学习笔记(四)解析库的使用

    解析库的使用 使用正则表达式 比较烦琐 而且万一有地方写错了 可能导致匹配失败 对于网页的节点来说 有 id class 或其他属性 而且节点之间还有层次关系 在网页中可以通过 XPath 或 css 选择器来定位一个或多个节点 利用 XP