Python中xpath选择器的学习

版权声明:董瑞 https://blog.csdn.net/qq_39226755/article/details/84946173

xpath选择器是一个很方便,又很容易上手的一个选择器,用了一段时间,总结一下经常用到的东西。还有一些我没有用到的,这里就不说啦。

目录:

  1. 自己画的一个思维导图(自己记忆力不好,这样记得清楚)
  2. 各种方法的案例
  3. 各种规则的案例

1.思维导图
在这里插入图片描述s

2.方法的使用
  首先展示一段html的源码,通过源码进行学习。为了达到效果我把最后的/ul标签和/div标签删掉

text = '''
<div class="dropdown" id="myDrap">
		<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
		<div class="txt-selected text-truncate">添加代码片</div>
		<svg class="icon d-block" aria-hidden="true">
			<use xlink:href="#csdnc-triangledown"></use>
		</svg>
		</a>
		<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
			<li><a data-code="html">HTML/XML</a></li>
			<li><a data-code="objc">objective-c</a></li>
			<li><a data-code="ruby">Ruby</a></li>
			<li><a data-code="php">PHP</a></li>
			<li><a data-code="csharp">C</a></li>
			<li><a data-code="cpp">C++</a></li>
			<li><a data-code="javascript">JavaScript</a></li>
			<li><a data-code="python">Python</a></li>
			<li><a data-code="java">Java</a></li>
			<li><a data-code="css">CSS</a></li>
			<li><a data-code="sql">SQL</a></li>
			<li><a data-code="plain">其它</a></li>
    '''

HTML()方法和tostring()方法
  代码如下,下面两种方法,展示了两种格式之间的转换,其中最应该注意的是编码与解码,由于字符串中存在中文字符,很容易出现乱码,同时HTML()方法里text参数最好转成字符串的形式。

html = etree.HTML(text)
print(type(html))#生成html的类型
bts = etree.tostring(html,encoding='utf-8')#将数据转化为字符串形式
print(type(bts))
result = etree.HTML(bts.decode('utf-8'))#再次转化为_Element的格式
print(etree.tostring(result,encoding='utf-8').decode('utf-8'))
print(type(result))

打印出的结果如下,自动补全了代码

<class 'lxml.etree._Element'>
<class 'bytes'>
<html><body><div class="dropdown" id="myDrap">
					<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
					<div class="txt-selected text-truncate">添加代码片</div>
					<svg class="icon d-block" aria-hidden="true">
						<use xlink:href="#csdnc-triangledown"/>
					</svg>
					</a>
					<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
						<li><a data-code="html">HTML/XML</a></li>
						<li><a data-code="objc">objective-c</a></li>
						<li><a data-code="ruby">Ruby</a></li>
						<li><a data-code="php">PHP</a></li>
						<li><a data-code="csharp">C</a></li>
						<li><a data-code="cpp">C++</a></li>
						<li><a data-code="javascript">JavaScript</a></li>
						<li><a data-code="python">Python</a></li>
						<li><a data-code="java">Java</a></li>
						<li><a data-code="css">CSS</a></li>
						<li><a data-code="sql">SQL</a></li>
						<li><a data-code="plain">其它</a></li>
    </ul></div></body></html>
<class 'lxml.etree._Element'>

parse()方法和HTMLParser()方法
  首先将html源码放入一个同级文件中,取名为test.html,获取源码并解析的代码如下,效果同上,不过遗憾的是中文字符出现了乱码,我暂时并没有解决

html = etree.parse('./test.html',etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

xpath()方法的使用

html = etree.HTML(text)#解析
target = html.xpath('//a[@data-code="python"]')#获取元素
print(target)

直接用在解析后的数据上即可,在括号中添加规则,打印结果如下

[<Element a at 0x27c71305088>]

显示获取到了一个元素

selenium中的xpath
  selenium是一个很万能的怕网站的方法,在必要的时候还是很需要的,这里的xpath方法和之前的大体相同,代码如下

扫描二维码关注公众号,回复: 6107718 查看本文章
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
submit_bt = driver.find_element_by_xpath('//*[@id="su"]')
ftConw = driver.find_elements_by_xpath('//*[@id="ftConw"]/p')
print(type(submit_bt))
print(type(ftConw))

  打印如下,第一个的数据类型是一个元素,第二个的数据类型是一个数组

<class 'selenium.webdriver.remote.webelement.WebElement'>
<class 'list'>

3.常用规则

html = etree.HTML(text)
target_1 = html.xpath('//div[@class="dropdown"]')#获取class="dropdown"的div节点
target_2 = html.xpath('//div[@class="dropdown"]/a/div')#获取div节点下的div节点
target_3 = target_2[0].xpath('./text()')#获取target_2下的内容
target_4 = html.xpath('//ul[@class="dropdown-menu"]//li')#获取所有ul元素下的所有li节点
target_5 = html.xpath('//ul[@class="dropdown-menu"]//li[4]/a/text()')#获取所有ul元素下的第4个li节点下的a节点的内容
target_6 = target_4[0].xpath('..//*')#target_4的父节点下的所有节点
target_7 = target_4[0].xpath('..//a[@*]/text()')#获取target_4的父节点下的所有任意属性的a节点下的内容
print(target_1)
print(target_2)
print(target_3)
print(target_4)
print(target_5)
print(target_6)
print(target_7)

结果如下

[<Element div at 0x2685ce47e88>]
[<Element div at 0x2685ce47f48>]
['添加代码片']
[<Element li at 0x2685ce47fc8>, <Element li at 0x2685ce4a048>, <Element li at 0x2685ce4a088>, <Element li at 0x2685ce4a0c8>, <Element li at 0x2685ce4a108>, <Element li at 0x2685ce4a188>, <Element li at 0x2685ce4a1c8>, <Element li at 0x2685ce4a208>, <Element li at 0x2685ce4a248>, <Element li at 0x2685ce4a148>, <Element li at 0x2685ce4a288>, <Element li at 0x2685ce4a2c8>]
['PHP']
[<Element li at 0x2685ce47fc8>, <Element a at 0x2685ce4a3c8>, <Element li at 0x2685ce4a048>, <Element a at 0x2685ce4a408>, <Element li at 0x2685ce4a088>, <Element a at 0x2685ce4a488>, <Element li at 0x2685ce4a0c8>, <Element a at 0x2685ce4a348>, <Element li at 0x2685ce4a108>, <Element a at 0x2685ce4a448>, <Element li at 0x2685ce4a188>, <Element a at 0x2685ce4a4c8>, <Element li at 0x2685ce4a1c8>, <Element a at 0x2685ce4a508>, <Element li at 0x2685ce4a208>, <Element a at 0x2685ce4a548>, <Element li at 0x2685ce4a248>, <Element a at 0x2685ce4a588>, <Element li at 0x2685ce4a148>, <Element a at 0x2685ce4a5c8>, <Element li at 0x2685ce4a288>, <Element a at 0x2685ce4a608>, <Element li at 0x2685ce4a2c8>, <Element a at 0x2685ce4a648>]
['HTML/XML', 'objective-c', 'Ruby', 'PHP', 'C', 'C++', 'JavaScript', 'Python', 'Java', 'CSS', 'SQL', '其它']

  最后一个关于@*的规则,我没有用过,也没有想通在哪里能用到,但是看到了,就写上了
  同时xpath的语法还有很多,但是我没有用过,就不瞎写了,另外再加一个,很多浏览器按下F12后都可以手动去选择元素,然后右键可以直接copy xpath地址

猜你喜欢

转载自blog.csdn.net/qq_39226755/article/details/84946173