持久化:将数据保存到硬盘上。
序列化:将一个类保存文件中,叫序列化
反序列化:从一个文件中读取出一个类。
=======================================================
1.什么是xml。
(1)定义:xml称为可扩展标记性语言。
(2)特点:xml具有自描述特性。是一种半结构化数据。
(3)作用:xml的设计宗旨是用来传输数据。
2.xml和html的区别。
(1)语法要求不同:xml的语法要求更严格。
1、在html中不区分大小写,在xml中严格区分
2、在html中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略
3、在xml中,拥有单个标记二没有匹配的结束标记的元素必须用一个/字符作为结尾。
4、在xml中,属性值必须分装在引号中。在html中,引号可用可不用。
5、在html中属性名可以不带属性值,xml必须带
6、xml文档中,空白部分不会被解析器自动删除,但是html是过滤掉空格
(2)作用不同:xml主要用来传输数据。html主要用来显示数据,以及更好的显示数据。
(3)标记不同:xml没有固定的标记。html标签是固定的。
3.xpath
(1)什么是xpath?
xpath是一种语法,用来提取xml或者html页面内容的语法。
(2)xpath语法内容
元素:指一个xml的标签以及标签的所有内容
属性:class,name
内容:a标签的内容就是aaa,b标签的内容就是bbb
标签:和元素一样。 aaa bbb 1.选取节点 nodename ----选取此标签的所有子标签。 / ----从根节点开始选取 // -----从任意位置开始选取。 . ---选取当前节点 .. ---选取父节点 @ ---选取属性 text() ---选取内容 2.谓语 英语中谓语用来限定。 xpath的谓语也是限定选取的内容的。 /bookstore/book[1]---表示取bookstroe下面的第一个book标签。 /bookstore/book[last()]---表示取bookstroe下面的最后一个book标签 /bookstore/book[last()-1]---表示取bookstroe下面倒数第二个book标签 /bookstore/book[position()>1]---表示从bookstroe下面的第二本书开始取 //title[@lang] ---取一个有lang属性的title标签。 //title[@lang="eng"] ---取一个有lang属性,并且lang属性为eng的title标签。
3.选取未知节点
* —匹配任意节点
@* --匹配任意属性
4.选取若干路径
//title|//price – 选取所有的title标签和price标签。
4.在python中如何使用xpath?
通过lxml模块,可以使用xpath语法来筛选元素。
#导包
from lxml import etree
(1)将字符串形式的xml内容解析成可以调用xpath语法的element对象的方法。
html_element = etree.HTML(html_str)
html_element.xpath()--->返回值也是一个element,表示还可以继续调用xpath方法来继续筛选元素。
etree.HTML()可以帮我们补齐标签内容。
(2)将一个html文件转化成element对象的方法。
from lxml import etree
html = etree.parse('demo.html')
# print(html)
print(etree.tostring(html,pretty_print=True,encoding='utf-8').decode('utf-8'))
当使用parse方法解析一个xml或者html文件时,语法必须严格按照xml的标签语法。标签必须对应。
作业:
1、药网数据爬取:
url:https://www.111.com.cn/categories/953710?tp=10-1
要求:抓取50页
字段:总价,描述,评论数量,详情页链接
用正则爬取。
import re, requests,json
class Yao:
def __init__(self, url):
self.url = url
self.result = []
self.parse()
def parse(self):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
}
for i in range( 1, 51 ):
url = self.url % i
response = requests.get( url, headers=headers )
html = response.text
# print(html)
ul_pattern = re.compile( 'class="itemSearchList">(.*?)</ul>', re.S )
ul_res = ul_pattern.search( html ).group( 1 )
# print(ul_res)
li_list_pattern = re.compile( '<li.*?>(.*?)</li>', re.S )
li_list = li_list_pattern.findall( ul_res )
# print(li_list)/
for li in li_list:
res = {}
price_pattern = re.compile( '<span>(.*?)</span>', re.S )
price_res = price_pattern.search( li ).group( 1 ).strip() if price_pattern.search( li ) else ''
res['price'] = price_res
# print(price_res)
des_pattern = re.compile( 'self"></span>(.*?)</a>', re.S )
des_res = des_pattern.search( li ).group( 1 ).strip() if des_pattern.search( li ) else ''
res['description'] = des_res
# print(des_res)
comments_pattern = re.compile( '评论 <em>(.*?)</em>', re.S )
comments_res = comments_pattern.search( li ).group( 1 ).strip() if comments_pattern.search( li ) else '0'
res['comments'] = comments_res
# print( comments_res )
url_pattern = re.compile( r'href="//(.*?)"', re.S )
url_res = url_pattern.search( li ).group( 1 ).strip() if url_pattern.search( li ) else ''
res['url'] = url_res
# print(url_res)
self.result.append(res)
if __name__ == '__main__':
url = 'https://www.111.com.cn/categories/953710-j%s.html'
yao = Yao( url )
with open('result/yao.json','w',encoding='utf-8') as fp:
json.dump(yao.result,fp)