#coding:utf-8
#__author__='wang'
#lxml第三方的HTML解析庫在對HTML進行解析的時候,使用的xpatn文法,xpath是通過
路徑的形式在HTML中選擇節點
#etree:element etree元素樹,元素指的就是HTML中的标簽
from lxml import etree
#加載本地HTML檔案
#html是一個ElementTree類型的對象
html = etree.parse('index.html')
# print type(html)
# print html
#tostring()是将一個ElementTree類型的對象轉換成一個HTML字元串,pretty_print
美化輸出
# result = etree.tostring(html,pretty_print=True)
# print type(result)
# print result
#fromstring()是将一段字元串轉換成一個Element對象
# html = """
# <a href='http://www.zhihu.com'>知乎</a>
# """
# result = etree.fromstring(html)
# print type(result)
# print result
#如何從本地HTML中提取标簽及标簽内容
#1.//a:表示從目前文檔中搜尋a标簽而不考慮a标簽的位置
# a = html.xpath('//a')
# print a
#2.擷取a标簽的class屬性、href屬性值,擷取屬性時一定要使用@
# result = html.xpath('//a/@class')
# result = html.xpath('//a/@id')
# result = html.xpath('//a/@href')
# print result
#3./text():隻擷取标簽文本内容,子标簽的文本内容無法擷取
# result = html.xpath('//a/text()')
# result = html.xpath('//p/text()')
# result = html.xpath('//div/text()')
#//text():可以将該标簽以及該标簽所有子标簽内的文本内容全部擷取出來
# result = html.xpath('//div//text()')
# for res in result:
# print res
#4.擷取ul标簽内的li标簽内的a标簽,并且a标簽的id是second_a的一個标簽
#[@id="second_a"]:通過屬性對要查找的标簽進行限制
# result = html.xpath('//ul/li/a[@id="second_a"]/text()')
# print result[0]
#5.last():擷取ul标簽下的最後一個li标簽
# result = html.xpath('//ul/li[last()]')[0]
#在li這個Element對象的基礎上繼續使用xpath進行下一步的元素定位
# result = result.xpath('a[@class="first_a"]/text()')
# print result
#
# result = html.xpath('//ul/li[2]')[0]
#
# result = result.xpath('a[@href]')[0]
# print result
#contains(@class,"first"):查找class屬性值中包含first值的标簽,一般用在class
屬性值比較多的時候
result = html.xpath('//div[@class="one"]/p[contains(@class,"first")]
/text()')[0]
print result
#除了有contains函數,還有class屬性以xx開頭的判斷函數,以xx結尾的判斷函數
#如果解析的是一段HTML源碼字元串
html_string = """
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8"/>
<title>lxml中xpath的用法</title>
</head>
<body>
<ul>
<li><a href="http://www.baidu.com" target="_blank" rel="external nofollow" class="first_a">百度一下
</a></li>
<li><a href="http://mail.qq.com" target="_blank" rel="external nofollow" id="second_a">QQ郵箱</a></li>
<li><a href="http://www.taobao.com" target="_blank" rel="external nofollow" class="first_a">淘寶網</a>
</li>
<li><a href="http://pypi.python.com" target="_blank" rel="external nofollow" class="second_a">Python
</a></li>
</ul>
<p class="one">first_p_tag</p>
<p id="second">second_p_tag</p>
<div class="one">
first_p_tag
<p class="first second third">1111</p>
<a href="#" target="_blank" rel="external nofollow" >2222</a>
</div>
</body>
</html>
"""
# html_object = etree.HTML(html_string)
# print type(html_object)
# print html_object
#
# result = html_object.xpath('//div/a/text()')
# print result[0]
#/xpath路徑文法中的/,一個斜杠的含義隻能查詢下一級的直接子節點,而子節點的子節點
是無法擷取的
#xpath路徑中的//,含義就是可以查詢路徑中的子孫節點
# result = html_object.xpath('//ul//a/text()')
# print result[0]