-
XPath(XML Path Language),是一门在XML文档中查找信息的语言
-
XPath开发工具
- 开元的XPath表达式工具:XMLQuire
- chrome插件:Xpath Helper
- Firefox插件:XPath CHecker
-
常用路径表达式:
- nodename:选取此节点的所有子节点
- /:从根节点开始选
- //:选取原物,而不考虑元素的具体位置
- .:当前节点
- ..:父节点
- @:选取属性
- 案例
- bookstore:选取bookstore下的所有子节点
- /bookstore:选取根元素
- bookstore/book:选取bookstore的所有为book的子元素
- //book:选取book子元素
- //@lang:选取名称为lang的所有属性
-
谓语(Predicates)
- 谓语用来查找某个特定的节点,被镶嵌在方括号中
- /bookstore/book[1]:选取第一个属于bookstore下叫book的元素
- /bookstore/book[last()]:选取最后一个属于bookstore下叫book的元素
- /bookstore/book[last()-1]:选取倒数第二个属于bookstore下叫book的元素
- /bookstore/book[position()❤️]:选取属于bookstore下叫book的前两个元素
- /bookstore/book[@lang]:选取属于bookstore下叫book的,含有属性lang元素
- /bookstore/book[@lang='cn']:选取属于bookstore下叫book的,含有属性lang的值是cn元素
- /bookstore/book[@lprice<90]/title
-
通配符
- '*':任何元素节点
- @*:匹配任何属性节点
- node():匹配任何类型的节点
-
选取多个路径
- //book/title | //book/author:选取book元素中的title和author元素、
- //title | //price:选取文档中所有的title和price元素
lxml库
- python的HTML/XML的解析器
- 官方文档:https://lxml.de/index.html
- 功能:
- 解析HTML,案例v29
- 文件读取,案例v30,v31
- etree和XPath的配合使用,案例v32
from lxml import etree
html = etree.parse("./v31.html")
print(type(html))
rst = html.xpath('//book')
print(type(rst))
print(rst)
rst = html.xpath("//book[@category='sports']")
print(type(rst))
print(rst)
rst = html.xpath("//book[@category='sports']/year")
rst = rst[0]
print(type(rst))
print(rst.tag)
print(rst.text)
CSS选择器 BeautifulSoup4
-
现在使用BeautifulSoup4
-
几个常用的提取信息工具比较
- 正则:很快,不好用,不许安装
- beautifulsoup:慢,使用简单,安装简单
- lxml:比较快,使用简单,安装一般
-
案例 v33
-
四大对象
- Tag
- 对应Html中的标签
- 可以通过soup.tag_name
- tag两个重要属性
- name
- attrs
- a34
- NavigableString
- 对应内容值
- BeautifulSoup
- 表示的是一个文档的内容,大部分可以把他当做tag对象
- Comment
- 特殊类型的NavigableString对象
- 对其输出,则内容不包括注释符号
- Tag
-
遍历文档对象
- contents:tag的子节点以列表的方式给出
- children:子节点以迭代器形式返回
- descendants:所有孙节点
- string
-
搜索文档对象
- find_all(name, attrs, recursive, text, **kwargs)
- name:按照那个字符串搜索,可以传入的内容为
- 字符串
- 正则
- 列表
- kewwortd参数,可以用来表示属性
- text:对应tag的文本值
- name:按照那个字符串搜索,可以传入的内容为
- find_all(name, attrs, recursive, text, **kwargs)
-
css选择器
- 使用soup.select,返回一个列表
- 通过标签名称:soup.select('titile')
- 通过雷鸣:soup.select(".content")
- id查找:soup.select("#name_id")
- 组合查找:soup.select("div #input_content")
- 属性查找:soup.select("img[class='photo']")
- 获取tag内容:tag.get_text
# coding=utf-8
from urllib import request
from bs4 import BeautifulSoup
url = "http://www.baidu.com"
rsp = request.urlopen(url)
content = rsp.read()
soup = BeautifulSoup(content, 'lxml')
titles = soup.select('title')
print(titles)
metas = soup.select("meta[content='always']")
print(metas)