1. 介绍
之前BeautifulSoup的用法,这已经是很强大的库了,不过还有一些比较流行的解析库,例如lxml,使用的是Xpath语法,同样是效率比较高的解析方法,如果对BeautifulSoup使用不太习惯,可以尝试下Xpath
- 解析页面模块比较:
- 正则表达式是进行内容匹配,将符合要求的内容全部获取;
- xpath()能将字符串转化为标签,它会检测字符串内容是否为标签,但是不能检测出内容是否为真的标签;
- Beautifulsoup是Python的一个第三方库,它的作用和 xpath 作用一样,都是用来解析html数据的相比之下;xpath的速度会快一点,因为xpath底层是用c来实现的
- 三者语法不同,正则表达式使用元字符,将所有获得内容与匹配条件进行匹配,
而xpath和bs4将获取的解析后的源码进行按条件筛选,筛选出想要的标签即根据标签属性来找到指定的标签,之后对标签进行对应内容获取;
xpath:全称XML PATH Language, 一种小型的查询语言;
支持的解析:
XML格式,html格式, 通过元素,和属性进行导航
官网:http://lxml.de/index.html
w3c:http://www.w3school.com.cn/xpath/index.asp
2. 安装
pip install lxml
3.Xpath的语法
3.1选取节点
3.1.1 常用的路径表达式
3.1.2.通配符
XPath通配符可用来
选取位置的XML元素
3.1.3 选取若干路径
通过在路径表达式中使用“|”运算符,可以选取若干个路径
3.1.4 谓语
谓语被切在方括号内,用来查找某个特定的节点或包含某个指定的值的节点
3.1.5 XPath运算符
3.2 使用
selector = etree.HTML(html)
对全文进行扫描
div[@id=“content”]
str = selector.xpath(’//div[@id=“content”]/ul[@id=“ul”]/li/text()’)
需求: 获取文件中div的属性id为”url“里面的所有a标签的href属性
str = selector.xpath(’//div[@id=“url”]/a/@href’)
获取符合条件的标签内容;
str = selector.xpath(’//div"]’).extract()
小例子:
爬取界面
代码:
from lxml import etree
from random import choice
import requests
user_agents=[
"User-Agent:Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50",
"User-Agent:Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
]
headers={
"User-Agent":choice(user_agents)
}
url="https://www.qidian.com/rank/yuepiao?chn=21"
response=requests.get(url,headers)
#核心代码
e=etree.HTML(response.text)
names=e.xpath('//h4/a/text()')
authors=e.xpath('//p[@class="author"]/a[1]/text()')
for name,author in zip(names,authors):
print(name,":",author)
爬取mooc网的课程
"""
- 爬取的链接: http://www.imooc.com/course/list
- 爬取的内容: 课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述
- 爬取的内容如何存储:
- 文件(.csv, );
- mysql数据库;
- 分析爬取的信息;
- 词云
"""
import re
import requests
import lxml.etree as etree
import csv
def get_content(url):
"""爬取页面内容的函数"""
try:
user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36"
response = requests.get(url, headers=