Python实现urllib3和requests库使用 | python爬虫实战之五
HTML解析
通过上面的库, 都可以拿到HTML内容。
HTML的内容返回给浏览器, 浏览器就会解析它, 并对它渲染。
HTML超文本表示语言, 设计的初衷就是为了超越普通文本, 让文本表现力更强。
XML扩展标记语言, 不是为了代替HTML, 而是觉得HTML的设计中包含了过多的格式, 承担了一部分数据之外的任务, 所以才设计了XML只用来描述数据。
HTML和XML都有结构, 使用标记形成树型的嵌套结构。DOM(Document Object Model) 来解析这种嵌套树型结构, 浏览器往往都提供了对DOM操作的API, 可以用面向对象的方式来操作DOM。
XPath
https://www.w3school.com.cn/xpath/index.asp 中文教程
XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。
XPath 术语
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
节点关系
父(Parent):每个元素以及属性都有一个父。
子(Children):元素节点可有零个、一个或多个子。
同胞(Sibling):拥有相同的父的节点。
先辈(Ancestor):某节点的父、父的父,等等。
后代(Descendant):某个节点的子,子的子,等等。
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
工具
XMLQuire win7+需要.NET框架4.0-4.5。
测试XML、XPath
使用工具去测试XML、XPath。
在XPath中, 有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
/根结点
元素节点
Corets, Eva元素节点,
id=”bk 104”是属性节点, id是元素节点book的属性
节点之间的嵌套形成父子(parent、children) 关系。
具有同一个父节点的不同节点是兄弟(sibling) 关系。
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
谓语就是查询的条件。
XPath轴(Axes)
XPATH实例
以斜杠开始的称为绝对路径,表示从根开始。
不以斜杆开始的称为相对路径,一般都是依照当前节点来计算。当前节点在上下文环境中,当前节点很可能已经不是根节点了。
一般为了方便, 往往xml如果层次很深, 都会使用//来查找节点。
我们需要对上面这些XPATH实例熟练练习。
lxml
Ixml是Python下功能丰富的XML、HTML解析库, 性能非常好, 是对libxml2和libxslt的封装。最新版支持Python 2.6+, python 3支持到3.6。
官方网站:https://lxml.de/index.html
CentOS编译安装需要
#yum install libxml2-devel libxslt-devel
注意,不同平台不一样,参看http://lxml.de/installation.html
lxml安装
$pip install lxml
那么如何来构建一个HTML呢?
from lxml import etree
root = etree.Element('html')
body = etree.Element('body')
root.append(body)
div1 = etree.SubElement(body, 'div')
div2 = etree.SubElement(body, 'div')
print(etree.tostring(root))
执行结果:
进行一个pretty_print打印
print(etree.tostring(root, pretty_print = True).decode())
etree还提供了2个有用的函数
etree.HTML(text) 解析HTML文档, 返回根节点
anode.xpath('xpath路径') 对节点使用xpath语法
从豆瓣电影中提取”本周口碑榜”
我们可以下载插件ChroPath,然后去”本周口碑榜”检查,通过路径查找获取具体内容。当然我们也可以爬虫实现:
from lxml import etree
import requests
urls = ['https://movie.douban.com/']
session = request.session()
with session:
for url in urls:
response = session.get(url, headers = {
'User-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
})
content = response.text
# print(content)
# XPath //div[@class='billboard-bd']//tr//td/a/text()
html = etree.HTML(content)
titles = html.xpath("//div[@class='billboard-bd']//tr//td/a/text()")
for t in titles:
print(t)
执行结果:
此时,想要获取到标签以及内容,我们需要修改代码:
titles = html.xpath("//div[@class='billboard-bd']//tr//text()")
print('-'*30)
执行结果:
当然我们也有另外的方式,修改代码:
titles = html.xpath("//div[@class='billboard-bd']//tr")
for title in titles:
txt = title.xpath('.//text()')
print(''.join(map(lambda x: x.strip(), txt)))
print('-'*30)
执行结果:
我们对于XPath的处理不要过于复杂,定位到我们需要的内容,然后之后的处理可以通过Python来进行。
配套视频课程,点击这里查看
获取更多资源请订阅Python学习站