学习xpath
学习目标:
-
学习xpath,使用lxml+xpath提取内容。
-
使用xpath提取丁香园论坛的回复内容。
Xpath常用的路径表达式:
1.XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
2.在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
3.XML文档是被作为节点树来对待的。
XPath使用路径表达式在XML文档中选取节点。节点是通过沿着路径选取的。下面列出了最常用的路径表达式:
-
nodename 选取此节点的所有子节点。
-
/ 从根节点选取。
-
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
-
. 选取当前节点。
-
… 选取当前节点的父节点。
-
@ 选取属性。
-
/text() 提取标签下面的文本内容,如:
- /标签名 逐层提取
- /标签名 提取所有名为<>的标签
- //标签名[@属性=“属性值”] 提取包含属性为属性值的标签
- @属性名 代表取某个属性名的属性值
-
详细学习:https://www.cnblogs.com/gaojun/archive/2012/08/11/2633908.html
使用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的性能。
实战:提取丁香园论坛的回复内容
# 导入库
from lxml import etree
import requests
url = "http://www.dxy.cn/bbs/thread/626626#626626"
1.获取url的html
req = requests.get(url)
html = req.text
html
2.lxml解析html
tree = etree.HTML(html)
tree
3.利用Xpath表达式获取user和content(完成xpath的语句)
user = tree.xpath('//div[@class="auth"]/a/text()')
print(user)
content = tree.xpath('//td[@class="postbody"]')
print(content)
4. 保存爬取的内容
results = []
for i in range(0, len(user)):
# print(user[i].strip()+":"+content[i].xpath('string(.)').strip())
# print("*"*80)
# 因为回复内容中有换行等标签,所以需要用string()来获取数据
results.append(user[i].strip() + ": " + content[i].xpath('string(.)').strip()) # strip()删除开头或是结尾的字符
# 打印爬取的结果
for i,result in zip(range(0, len(user)),results):
print("user"+ str(i+1) + "-" + result)
print("*"*100)