一、常用xpath表达式
- 属性定位:
- #找到class属性值为song的div标签
- //div[@class="song"]
- 层级&索引定位:
- #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
- //div[@class="tang"]/ul/li[2]/a
- 逻辑运算:
- #找到href属性值为空且class属性值为du的a标签
- //a[@href="" and @class="du"]
- 模糊匹配:
- //div[contains(@class, "ng")]
- //div[starts-with(@class, "ta")]
- 取文本:
- # /表示获取某个标签下的文本内容
- # //表示获取某个标签下的文本内容和所有子标签下的文本内容
- //div[@class="song"]/p[1]/text()
- //div[@class="tang"]//text()
- 乱码:name = name.encode('ISO-8859-1').decode('gbk') 或 response.encoding='utf-8'
- 取属性:
- //div[@class="tang"]//li[2]/a/@href
- xpath函数返回的总是一个列表
- 并集:a_list = tree.xpath('//div[@class="bottom"]/ul/li/a | //div[@class="bottom"]/ul/div[2]/li/a')
- 注意:xpath表达式中不可以出现tbody标签
二、基础使用
- 下载:pip install lxml
- 导包:from lxml import etree
- 官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4
- 将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
- 本地文件:
- tree = etree.parse('本地文件路径')
- etree.parse('D:/python3.6/scrapy/./test.html', etree.HTMLParser())
- tree.xpath("xpath表达式")
- 网络数据:
- tree = etree.HTML("网络请求到的页面数据")
- tree.xpath("xpath表达式")
- xpath插件:就可以直接将xpath表达式作用于浏览器的网页当中
- 安装:更多工具-》扩展程序-》开启右上角的开发者模式-》xpath插件拖动到页面即可
- 快捷键:启动和关闭插件 ctrl + shift + x
Beautifulsoup模块
- Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.
- Beautiful Soup会帮你节省数小时甚至数天的工作时间.你可能在寻找 Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发.
- 官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4
- 官网推荐使用lxml作为解析器,因为效率更高.
- 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.
- 中文文档点击
一、环境安装
- 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等
- windows:
- 打开文件资源管理器(文件夹地址栏中)
- 地址栏上面输入 %appdata%
- 在这里面新建一个文件夹 pip
- 在pip文件夹里面新建一个文件叫做 pip.ini ,内容写如下即可
- [global]
- timeout = 6000
- index-url = https://mirrors.aliyun.com/pypi/simple/
- trusted-host = mirrors.aliyun.com
- linux:
- cd ~
- mkdir ~/.pip
- vi ~/.pip/pip.conf
- 编辑内容,和windows一模一样
- 需要安装:pip install bs4
- bs4在使用时候需要一个第三方库,把这个库也安装一下
- pip install lxml
二、基础使用
核心思想:将html文档转换成Beautiful对象,然后调用该对象中的属性和方法进行html文档指定内容的定位查找。
1、使用流程
- 导包:from bs4 import BeautifulSoup
- 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容
- 转化本地文件:soup = BeautifulSoup(open('本地文件'), 'lxml')
- 转化网络文件:soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')
- 打印soup对象显示内容为html文件中的内容
2、基础巩固
- 根据标签名查找:
- soup.a 只能找到第一个符合要求的标签
- 获取属性:
- soup.a.attrs 获取a所有的属性和属性值,返回一个字典
- soup.a.attrs['href'] 获取href属性
- soup.a['href'] 也可简写为这种形式
- soup.a.get('href')
- 获取内容:
- soup.a.string
- soup.a.text
- soup.a.get_text()
- 【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
- find:找到第一个符合要求的标签:
- soup.find('a') 找到第一个符合要求的
- soup.find('a', title="xxx")
- soup.find('a', alt="xxx")
- soup.find('a', class_="xxx")
- soup.find('a', )
- soup.find('a',attr={'id':'xx'})
- find_all:找到所有符合要求的标签:
- soup.find_all('a')
- soup.find_all(['a','b']) 找到所有的a和b标签
- soup.find_all('a', limit=2) 限制前两个
- soup.find('a',attr={'class':'xx'})[1:] 不要第一个
- 根据选择器选择指定的内容:
- select:soup.select('#feng')
- 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
- 层级选择器:div .dudu #lala .meme .xixi 下面好多级
- 层级选择器:div > p > a > .lala 只能是下面一级
- 【注意】select选择器返回永远是列表,需要通过下标提取指定的对象
| 解析器 | 使用方法 | 优势 | 劣势 |
|---|---|---|---|
| Python标准库 | BeautifulSoup(markup, "html.parser") |
|
|
| lxml HTML 解析器 | BeautifulSoup(markup, "lxml") |
|
|
| lxml XML 解析器 |
BeautifulSoup(markup, ["lxml", "xml"]) BeautifulSoup(markup, "xml") |
|
|
| html5lib | BeautifulSoup(markup, "html5lib") |
|
|
#安装 Beautiful Soup pip install beautifulsoup4 #安装解析器 Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml: $ apt-get install Python-lxml $ easy_install lxml $ pip install lxml 另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib: $ apt-get install Python-html5lib $ easy_install html5lib $ pip install html5lib