Xpath常用的路径表达式:
- XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
- 在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
- XML文档是被作为节点树来对待的。
XPath使用路径表达式在XML文档中选取节点。节点是通过沿着路径选取的。下面列出了最常用的路径表达式:
- nodename 选取此节点的所有子节点。
- / 从根节点选取。
- // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
- . 选取当前节点。
- … 选取当前节点的父节点。
- @ 选取属性。
- /text() 提取标签下面的文本内容
- 如:
- /标签名 逐层提取
- /标签名 提取所有名为<>的标签
- //标签名[@属性=“属性值”] 提取包含属性为属性值的标签
- @属性名 代表取某个属性名的属性值
使用lxml解析
-
导入库:from lxml import etree
-
lxml将html文本转成xml对象
- tree = etree.HTML(html)
-
用户名称:tree.xpath(’//div[@class=“auth”]/a/text()’)
-
回复内容:tree.xpath(’//td[@class=“postbody”]’) 因为回复内容中有换行等标签,所以需要用string()来获取数据。
- string()的详细见链接:https://www.cnblogs.com/CYHISTW/p/12312570.html
-
Xpath中text(),string(),data()的区别如下:
- text()仅仅返回所指元素的文本内容。
- string()函数会得到所指元素的所有节点文本内容,这些文本讲会被拼接成一个字符串。
- data()大多数时候,data()函数和string()函数通用,而且不建议经常使用data()函数,有数据表明,该函数会影响XPath的性能。
实战:爬取丁香园-用户名和回复内容
- 爬取思路:
- 获取url的html
- lxml解析html
- 利用Xpath表达式获取user和content
- 保存爬取的内容
#导入相关的库
import requests
from lxml import etree
url = 'http://www.dxy.cn/bbs/thread/626626#626626'
1.获取url的html
res = requests.get(url)
html = res.text
2.lxml解析html
tree = etree.HTML(html)#这里的html是内容
tree
3.利用xpath表达式获取user和content
#获取用户
user = tree.xpath('//div[@class="auth"]/a/text()')
user
#获取回复的内容
content = tree.xpath('//td[@class="postbody"]')
content
4.保存爬取的内容
results = []
for i in range(0, len(user)):
results.append(user[i].strip()+': '+content[i].xpath('string(.)').strip())
for i in results:
print(i)
进一步优化
for i, result in zip(range(0, len(user)), results):
print('user'+str(i+1)+'-'+result)
print('*'*100)