xpath教程一---简单的标签搜索
工具
- Python3版本
- lxml库【优点是解析快】
- HTML代码块【从网络中获取或者自己杜撰一个】
- requests【推荐安装,从网页上获取网页代码练手,再好不过了】
讲解
网页代码都是成对的标签,基础结构如下
<!DOCTYPE html>
<html lang="en">
<head>
<!--网页头部信息-->
<title>网页名</title>
</head>
<body>
<!--下面是网页正文-->
<div>
div-text
</div>
</body>
</html>
- 最外部肯定是html,所有的html代码基本都是放这里面
- html内部分两块,一块是头head,另一块是身体body
- head部主要是放网页名、一些申明、和SEO优化的东西
- body部分就是浏览器显示的内容
网页结构基本都是如此,一般有价值的数据都是在body中
现在开始学习Xpath
- 第一步:杜撰一个HTML代码块
html_str = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>网页名</title>
</head>
<body>
<div>
div-text
<span>span-text</span>
<a>a-text</a>
<p>p-text</p>
</div>
<table>
<tr>
<th>Heading</th>
<th>Another Heading</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
table-text-2
</table>
</body>
</html>
"""
- 第二步:检测Python和lxml库
from lxml import etree
html = etree.HTML(html_str)
这段代码是从lxml
中导入etree
,然后将前面杜撰的一个html_str
字符串通过etree.HTML
函数,解析成支持xpath
的数据类型,并保存到html
变量中
两段代码链接起来,成功运行,那就说明lxml
库正常
下面就到了写 xpath 路径的时候了
-
任务一:解析出
head
里面的title
标签的值【即 ‘网页名’】- 获取网页名的值,是使用
title/text()
来获得, - 而
title
标签是head
的子级 head
标签就是最外部的标签- 所以整个的xpath路径是
head/title/text()
- 最后的python代码就是
print(html.xpath('head/title/text()'))
。这样就打印出了一个列表['网页名']
- 获取网页名的值,是使用
-
任务二:解析出
div
标签下span
、a
、p
标签里面的值span
标签值对应的xpath
路径是body/div/span/text()
,结果['span-text']
a
标签值对应的xpath
路径是body/div/a/text()
,结果['a-text']
p
标签值对应的xpath
路径是body/div/p/text()
,结果['p-text']
-
任务三:试着解析
div
标签的text()
- 就任务而言,任务三比任务二还轻松点,能获取
div
的子级标签值,获取父级也挺简单 div
对应的xpath
路径是body/div/text()
- 得到的结果是这样的
['\n div-text\n ', '\n ', '\n ', '\n ']
- 这里必须对结果好好解释下。首先是div里面有三个子级标签,这三个都不算做
text()
。如果没有子级,得到的结果列表就是一个元素;有两个子级,则列表有三元素;就像一根面条被切了两次,就有三根面条出现。【不是对着切(ˉ▽ ̄~) ~~】 - 另外
/n
是换行
- 就任务而言,任务三比任务二还轻松点,能获取
- 任务四:解析
th
和td
的文本值- 这次
th
和td
都有两个标签,首先按前面的方式来写路径 - 通过
body
,再到table
,然后是tr
,再是th
和td
- 最终的xpath是
body/table/tr/th/text()
和body/table/tr/td/text()
- 运行结果
['Heading', 'Another Heading']
,['row 1, cell 1', 'row 1, cell 2']
- 这次
最终的代码和运行截图
html_str = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>网页名</title>
</head>
<body>
<div>
div-text
<span>span-text</span>
<a>a-text</a>
<p>p-text</p>
</div>
<table class="2">
<tr>
<th>Heading</th>
<th>Another Heading</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
table-text-2
</table>
</body>
</html>
"""
from lxml import etree
html = etree.HTML(html_str)
print(html.xpath('head/title/text()'))
print(html.xpath('body/div/span/text()'))
print(html.xpath('body/div/a/text()'))
print(html.xpath('body/div/p/text()'))
print(html.xpath('body/div/text()'))
print(html.xpath('body/table/tr/th/text()'))
print(html.xpath('body/table/tr/td/text()'))