Xpath

在 XML 文档中查找信息的语言, 同样适用于 HTML

辅助工具

Xpath Helper

Chrome插件   快捷键 Ctrl + shift + x

XML Quire

xpath 编辑工具

Xpath 表达式

//   查找所有节点

//book

查找所有的book节点

/   查找当前节点

//book/title

查找所有book节点下的title子节

@   获取属性筛选

//book//title/@lang="en"

查找book节点下所有的title节点中,lang属性值为 "en"

[]  当前节点的限制

//bookstore/book[2]/title

查找bookstore下的第2个book节点下的title子节点

//title[@lang]

查找含有 lang 属性的 title节点

|   匹配多路径 (或匹配)

xpath表达式1 | xpath表达式2 | ... 

contains()  匹配一个属性值中包含某些字符串的节点

//div[contains(@id,'qiushi_tag_')]

text()  匹配文本值

 //book/title/text()="羊驼"

查找 book 下的 title 下文本为"羊驼"节点

lxml

安装

pip install lxml

使用

导入模块

from lxml import etree

创建解析对象

parse_html = etree.HTML(html)

调用 xpath 匹配

r_list = parse_html.xpath('xpath 表达式')

ps: 返回结果以列表形式

示例

抓取指定贴吧所有图片

  • 获取贴吧主页URL,下一页,找URL规律
  • 获取1页中所有帖子URL地址
  • 对每个帖子链接发请求,获取图片URL
  • 对每个图片链接发请求,以wb方式写入本地
import requests
from lxml import etree class BaiduSpider(object):
def __init__(self):
self.baseurl = 'http://tieba.baidu.com/f?'
# 使用IE的User-Agent
self.headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'} # 获取帖子链接
def get_turl(self, params):
res = requests.get(
self.baseurl,
params=params,
headers=self.headers
)
res.encoding = 'utf-8'
html = res.text
# 提取帖子链接
parse_html = etree.HTML(html)
t_list = parse_html.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
print(t_list)
# t_list : ['/p/23232/','/p/923423']
for t in t_list:
url = 'http://tieba.baidu.com' + t
# 提取图片链接,对图片链接发请求保存到本地
self.get_imgurl(url) # 获取图片链接
def get_imgurl(self, url):
res = requests.get(url, headers=self.headers)
res.encoding = 'utf-8'
html = res.text
# 提取图片链接列表
parse_html = etree.HTML(html)
# 图片链接列表
img_list = parse_html.xpath(
'//div[@class="d_post_content j_d_post_content clearfix"]/img[@class="BDE_Image"]/@src | //div[@class="video_src_wrapper"]/embed/@data-video')
# 视频链接列表
# img_list = parse_html.xpath('//div[@class="video_src_wrapper"]/embed/@data-video')
print(img_list)
for img in img_list:
self.write_img(img) # 把图片保存到本地
def write_img(self, img):
res = requests.get(img, headers=self.headers)
res.encoding = 'utf-8'
html = res.content
# 保存到本地
filename = img[-10:]
with open(filename, 'wb') as f:
f.write(html)
print('%s下载成功' % filename) # 主函数
def main(self):
name = input('贴吧名:')
begin = int(input('起始页:'))
end = int(input('终止页:'))
for page in range(begin, end + 1):
pn = (page - 1) * 50
# 定义查询参数
params = {
'kw': name,
'pn': str(pn)
}
self.get_turl(params) if __name__ == '__main__':
spider = BaiduSpider()
spider.main()

猫眼电影信息爬取

from urllib import request
import time
import csv
from lxml import etree class MaoyanSpider(object):
def __init__(self):
self.baseurl = 'https://maoyan.com/board/4?offset='
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'}
# 爬取页数计数
self.page = 1 # 获取页面
def get_page(self, url):
req = request.Request(url, headers=self.headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
# 直接调用解析函数
self.parse_page(html) # 解析页面
def parse_page(self, html):
parse_html = etree.HTML(html)
# 基准xpath,匹配每个电影信息节点对象列表
dd_list = parse_html.xpath('//dl[@class="board-wrapper"]/dd')
# dd_list : [<element dd at xxx>,<...>]
for dd in dd_list:
name = dd.xpath('./a/@title')[0].strip()
star = dd.xpath('.//p[@class="star"]/text()')[0].strip()
time = dd.xpath('.//p[@class="releasetime"]/text()')[0].strip()
print([name, star, time]) # 保存数据(存到csv文件)
def write_page(self, r_list):
# r_list : [(),(),()]
with open('猫眼.csv', 'a') as f:
writer = csv.writer(f)
for rt in r_list:
film = [
rt[0].strip(),
rt[1].strip(),
rt[2].strip()
]
writer.writerow(film) # 主函数
def main(self):
# 用range函数可获取某些查询参数的值
for offset in range(0, 41, 10):
url = self.baseurl + str(offset)
self.get_page(url)
print('第%d页爬取成功' % self.page)
self.page += 1
time.sleep(1) if __name__ == '__main__':
spider = MaoyanSpider()
spider.main()

爬虫 lxml 模块的更多相关文章

  1. python3爬虫lxml模块的安装

    1:在下载lxml之前,要先查看python的版本信息, 在CMD命令行输入python 再输入import pip; print(pip.pep425tags.get_supported()) -- ...

  2. 洗礼灵魂,修炼python(71)--爬虫篇—【转载】xpath/lxml模块,爬虫精髓讲解

    Xpath,lxml模块用法 转载的原因和前面的一样,我写的没别人写的好,所以我也不浪费时间了,直接转载这位崔庆才大佬的 原帖链接:传送门 以下为转载内容: --------------------- ...

  3. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...

  4. Python爬虫基础——XPath语法的学习与lxml模块的使用

    XPath与正则都是用于数据的提取,二者的区别是: 正则:功能相对强大,写起来相对复杂: XPath:语法简单,可以满足绝大部分的需求: 所以,如果你可以根据自己的需要进行选择. 一.首先,我们需要为 ...

  5. 爬虫(六):XPath、lxml模块

    1. XPath 1.1 什么是XPath XPath(XML Path Language) 是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. 1.2 ...

  6. Python爬虫 XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  7. lxml模块(应用xpath技术)

    一.lxml介绍 第三方库lxml是第一款表现出高性能特征的python xml库,天生支持Xpath1.0.XSLT1.0.定制元素类,甚至python风格的数据绑定接口.lxml是通过Cpytho ...

  8. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  9. python 爬虫 urllib模块 目录

    python 爬虫 urllib模块介绍 python 爬虫 urllib模块 url编码处理 python 爬虫 urllib模块 反爬虫机制UA python 爬虫 urllib模块 发起post ...

随机推荐

  1. 十四,K8s集群网络flannel及canal策略

    目录 k8s网络CNI之flannel k8s网络通信模型 常见CNI插件(Container,Network,Interface) 插件通信一般的解决方案 网络插件的应用 Flannel插件 fla ...

  2. python常用模块:标准文件及模块练习

    1.请写出规范目录 并解释各文件夹的作用 bin 执行文件core 核心业务逻辑conf 配置文件lib 库.公共代码.第三方模块db 数据分析log 日志文件readme 文本文档 2.改造atm+ ...

  3. string::compare

    1. compare string (1) 4int compare (const string& str) const noexcept; substrings (2) int compar ...

  4. Loadrunner:管理员权限启动报错“win10 为了对电脑进行保护,已经阻止此应用”

    问题 最近在尝试做性能测试,由于 Loadrunner 必须用管理员身份启动(普通用户权限启动会遇到各种权限不足的问题) 但是用管理员身份启动时,报错了:win10 为了对电脑进行保护,已经阻止此应用 ...

  5. guava的一些用法

    package guavaTest; import com.google.common.base.CharMatcher; import com.google.common.base.Joiner; ...

  6. Java-Dom4jHelper工具类

    import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import ja ...

  7. Java-DateUtils工具类

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  8. 题解 【NOIP2013】转圈游戏

    [NOIP2013]转圈游戏 Description n个小伙伴(编号从0到n-1)围坐一圈玩游戏.按照顺时针方向给n个位置编号,从0到n-1.最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置 ...

  9. css实现翻面效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. struts2-052漏洞

    转:https://thief.one/2017/09/06/1/ s2-052漏洞介绍 s2-052漏洞是当用户使用带有XStream组件的Struts-REST插件对XML格式的数据包进行反序列化 ...