Python——爬虫——数据提取
一、XML数据提取
(1)定义:XML指可扩展标记语言、标记语言,标签需要我们自行定义
(2)设计宗旨:是传输数据,而非显示数据,具有自我描述性
(3)节点关系: 父:每个元素及属性都有一个父、
子:每个元素可能有0个或者多个子
同胞:拥有相同的父的节点
先辈:父的父
后代:子的子
(4)XPath:是在XML中查找信息的语言,可以对XML文档元素和属性进行遍历
(5)XMLQuire是开源的XPath表达式编辑工具,Chrome插件是XPath Helper,Firefox插件Xpath Checker
(6)lxml的主要功能是如何解析和提取HTML/XMl数据,安装:pip install lxml,官方文档:lxml.de/index.html,lxm可以自动修正html代码
(7)文件读取
from lxml import etree #读取外部文件 html = etree.parse('/hello.html') result = etree.tostring(html,pretty_print=True)
(8)获取相应的标签
from lxml import etree #读取外部文件 html = etree.parse('/hello.html') result = etree.tostring(html,pretty_print=True) #获取<li>标签 result = html.xpath('//li') #获取<li>标签的所有class属性 result = html.xpath('//li/@class') #获取li标签下hre为link1.html的a标签 result = html.xpath('//li/a[@href="link1.html"]') #获取li标签下的span标签 result = html.xpath('//li/span') #获取最后一个li的a的href result = html.xpath('//li[last()]/a/@href') #获取倒数第二个元素内容 result = html.xpath('//li[last()-1]/a') #获取class值为bold的标签名 result = html.xpath('//*[class="blod"]')
二、CSS选择器(BeautifulSoup)
(1)BeautifulSoup用来解析HTML比较签单,目前使用的BeautifulSoup4,安装为:pip install BeautifulSoup4
(2)引用
from bs4 import BeautifulSoup
(3)四大对象种类
1.Tag:HTMl中的一个个标签
from bs4 import BeautifulSoup soup = BeautifulSoup(html) result = soup.title result = soup.head result = soup.a result = soup.p #它的两个重要属性 name he attrs soup.name #[document] soup.head.name #对于其他内部标签,输出的值便为标签本身的名称 soup.p.attrs #把p标签的所有属性打印出来,得到一个字典 soup.p['class'] #传入属性的名称,等同于 soup.p.get('class') soup.p['class'] = "newclass" #修改值 del soup.p['class'] #删除值
2.NavigableString,获取标签的内容
soup.p.string
3.BeautifulSoup:特殊的Tag对象
4.Comment:特殊的NavigableString对象
#将tag的子节点以列表的方式输出 soup.head.contents #输出的方式为列表,可以用列表的索引获取他的某一个元素 soup.head.contents[0] #.children,返回的不是list,可以用遍历获取所有的子节点 soup.head.children for child in soup.body.children: print(child) #.descendants对所有子孙节点进行递归循环 for child in soup.body.descendants: print(child)
(5)搜索文档树
1.find_all*(name,attrs,recursive,text,**kwargs)
(6)CSS选择器 soup.select()
#通过标签查找 soup.select('tilte’) #通过类名查找 soup.select('.sister') #通过ID名查找 soup.select('#link1') #组合查找 soup.select('p #link1') #直接子标签查找 soup.select("head > title") #属性查找 soup.select('a[class="sister"]') #获取内容 for title in soup.select('title') print(title.get_text())
三、JSON数据提取