第一节2
你的理解:
1. xpath作用:在Xml文档里快速定位元素。
如何使用xpath:通过一个Xml对象调用它。
一般的格式:
html.xpath(/html/@class)[0].tag/text
符号解释:
/ 用于定位
//表示省略,中间有啥我不管
@表属性
[]表示条件,条件里还可以用contains(元素 如@href或者text(),字符串)或startwith
[0] 切记Xpath返回值都是集合,所以一定要用index来获取确定的元素,这里只有一个元素就是自己。
local-name() 本地名,没啥用和普通写法等价。
获取一个元素的某个属性值:
@class或.get(‘’)或者.attrib[‘’]
30分钟就讲了这么点东西,总结:
xpath格式以及里面参数的含义,如何找到一个元素以及如何获取它的属性值。
第2节-1:
1.添加子元素
etree.SubElement() 三个参数为父元素,子元素名,属性名(如果是多个属性或者关键字,可以写成字典的形式)
2. CssSelect
非常简单,有时候你xpath的话多层定位是很复杂的,不如直接用css定位元素。
html.cssselect(".it21")[0].xpath(./context)
比如这段代码表示,可以通过相对路径找到it21这个值所在的元素,在此基础上./相对位置找context元素。
3.获取页面
import requests
response=requests.get(url) 获取页面,返回值是一个response对象
print(response.text) 获取页面内容
第2节-2
雅虎金融数据爬取demo步骤:
0.定义好一个变量代表股票代码(这里叫ticker),url是通用的,只需要换股票代码即可。
url = "https://finance/yahoo/s%?p%s" %(ticker,ticker)
[占位符: 在Python编程中,%s表示格化式一个对象为字符,%d表示整数。比如%s % "zhangsan" 的意思是,用%s来占位,值取zhangsan]
1. 通过requests.get(url)获取页面的resonse,然后response.text就是页面的内容。
2.页面内容的变量,需要通过
(1)lxml.html.fromstring(response_text) 转换成一个xml文档
或者
(2)如果你爬的是json格式的数据 通过json.loads(json_response_text)转换成json对象
注意:需要先import json
3.怎么取到自己想要的数据
经过第2步之后,我们有了xml文档或者json对象,就可以通过xpath来锁定元素。
summary_rows = html.xpath('/html/body//div[contains(@test-data,"summary-table")]' //tr)
--------------------表示获得body下面的div(div的test-data属性需包含summary-table),然后再向下找到tr元素。找到的不止一个元素,返回的是集合。
json对象就更容易了,直接层层取就可以,最后取到的是一个值(不是集合)。
直接 target_estimation = summary_json["quoteSummary"]["result"][0]['financilalData']
你还可以用这种方法取多个这样的值,比如说平均收益、最低成交价等等。
4. 把筛选出来的东西放到集合里
(1)引入OrderedDict 使字典的数据按插入顺序输出
(2)创建新的集合来存放和加工一下 筛选出来的数据
datalist = [ ] //用来装json对象中获取的数据
summary_data = OrderedDict() //新创建一个字典,让数据有序。
for i in earings_list['earningsDate']: //earingsDate是JSON对象下面的,下级是0和1-->下下级是raw和fmt。所以i就是0和1,遍历取0和1的fmt也就是时间字段。
datalist.append(i['fmt'])
earings_date = ' to '. join(datalist) //join表示把to添加到两个数据之间
for table_data in summary_rows // 由于和外层循环是分别往两个集合里添加数据,所以根本互不干扰。summary_rows是从一个tr集合里遍历每个tr。
raw_table_key = table_data.xpath(' .//td[contains(@xxxx,"C(black)")] //text() ') //从tr开始,寻找xxxx属性包含C(black)的td字段,找到之后再找下面的text文本。返回的也是集合。
raw_table_value = table_data.xpath(' .//td[contains(@xxxx,"Ta(end)")] //text() ') //包含Ta(end)的td下面的值是value。也就是 最低价:15rmb 这种效果。这需要你对页面的字段和值都在哪儿所有了解。
table_key = ' '.join(raw_table_key).strip() // raw_table_key里的元素以空格隔开,strip去掉两端字符(默认是去掉两端的空格)。
table_value = ' '.join(raw_table_value).strip()
summary_data.update({table_key:table_value}) //table_key和table_value,每个tr下最多只有一个。所以现在只是添加一个键值对。如果tr下有好几个符合条件的td,这里才会分几次添加键值对。
summary_data.update({'ly': ly, 'ticker':ticker})
5. 把整理出来的数据放到文件里
还记得with的好处吗,就是文件自动会帮你关掉。
with open(' /home/wayne/hdp.json','w') as fp:
json.dump(summary_data, fp ,indent = 4) //表示将dict转换成str后存入文件 缩进4个字
最后补充内容
json.dump()
直接把常用参数列一下好了
参数名 | 解释 |
obj | 要存入json文件的python对象 |
fp | 文件句柄 |
ensure_ascii | 设置为False的话才可以把中文以中文的形式存到文件里,否则会是’\xXX\xXX’这种 |
indent | 缩进的空格数,设置为非零值时,就起到了格式化的效果,比较美观 |
dumps和dump的区别:
dumps是将dict转化成str格式,loads是将str转化成dict格式。
dump和load也是类似的功能,只是与文件操作结合起来了。