python 爬虫第四天(xml,xpath)

第四天

  • xml
  • xpath

xml

1.什么是xml

     1.定义:xml称为可扩展标记语言     html:超文本标记语言
     2.特点:xml具有自描述特性,是一种半结构化数据。
     3.作用:xml的设计宗旨是用来传输数据

2.xml 和 html 的区别

	1.语法要求不同:xml的语法要求更严格
		(1)在html中不区分大小写,在xml中严格区分
	    (2)在html中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>标记。在xml中,是严格的树状结构,绝对不能省略任何标记。
	    (3)在xml中,拥有单个标记二没有匹配的结束标记的元素必须用一个/字符作为结尾。<a href=’www’/>4)在xml中,属性值必须分装在引号中。在html中,引号可用可不用。
	    (5)在html中属性名可以不带属性值,xml必须带
	    (6)xml文档中,空白部分不会被解析器自动删除,但是html是过滤掉空格
	2.作用不同:xml主要用来传输数据,html主要用来显示数据,以及更好的显示数据
	3.标记不同:xml没有固定的标签,html标签是固定的

xpath

1.xpath定义
xpath是一种语法,用来提取xml或者html页面内容的语法

2.xpath语法内容

		元素:指一个xml的标签以及标签的所有内容
		属性:class,name
		内容:a标签的内容就是aaa,b标签的内容就是bbb
		标签:和元素一样。
		<a>
				aaa
				<b>bbb</b>
		</a>



		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标签。

3.在python中如何使用xpath?

通过lxml模块,可以使用xpath语法来筛选元素。

	(1#导包
	from lxml import etree
	
	(2)将字符串形式的xml内容解析成可以调用xpath语法的element对象的方法。
		html_element = etree.HTML(html_str)
		
		html_element.xpath()--->返回值也是一个element,表示还可以继续调用xpath方法来继续筛选元素。
		etree.HTML()可以帮我们补齐标签内容。
		
	(3)将一个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的标签语法。标签必须对应。



例子(21from lxml import etree

text="""
    
"""
#将字符串转化成element对象
html=etree.HTML(text)
print(html)
#将element对象转化成字符串的方法
html_str=etree.tostring(html,pretty_print=True,encoding='utf-8').decode('utf-8') #tostring的结果是二进制的所以用decode('utf-8')
print(html_str)


例子(31from lxml import etree
#将文件转化成element对象
html=etree.parse('demo.html')  #demo.html是一个文件名字
print(html)
#将element对象转换成字符串
print(etree.tostring(html,pretty_print=True,encoding='utf-8').decode('utf-8'))


例子(22from lxml import etree

text = '''

'''
"""
获取所有的 
  • 标签 继续获取
  • 标签的所有 class属性 继续获取
  • 标签下href 为 link1.html 的 标签 获取
  • 标签下的所有 标签(包括孙子span) 获取
  • 标签下的标签里的所有 class 获取最后一个
  • 的 href 获取倒数第二个元素的内容 获取 class 值为 bold 的标签名 """ html=etree.HTML(text) print(etree.tostring(html,pretty_print=True,encoding='utf-8').decode('utf-8'))#pretty_print=True 让html格式更好看 # 获取所有的
  • 标签 li_list=html.xpath("//li") print(li_list) print(li_list[0]) print(li_list[0].tag) # tag 可以将标签是element对象转化成标签 # 继续获取
  • 标签的所有 class属性 li_class=html.xpath("//li/@class") print(li_class) # 继续获取
  • 标签下href 为 link1.html 的 标签 a=html.xpath("//li/a[@href='link.html']") print(a) # 获取
  • 标签下的所有 标签(包括孙子span) span_list=html.xpath('//li//span') print(span_list) # 获取
  • 标签下的标签里的所有 class a_class_list=html.xpath("//li/a/@class") # 获取最后一个
  • 的 href href=html.xpath('//li[last()]/a/@href') print(href) # 获取倒数第二个元素的内容 text=html.xpath("//*[last()-1]/text()") print(text) # 获取 class 值为 bold 的标签名 bold_tag=html.xpath("//*[@class='bold']") print(bold_tag) print(bold_tag[0].tag)
  • 你可能感兴趣的:(python爬虫)