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. BLE 5协议栈-主机控制接口(HCI)

    文章参考自:http://www.sunyouqun.com/2017/04/page/3/ .https://www.cnblogs.com/yuqilihualuo/p/9790164.html ...

  2. 启动Activity的单独事件方法2

    1.Button中创建android:onClick="sendmessage" sendmessage方法名 //MAIN_acitivity创建这个同名独立方法 响应Butto ...

  3. jQuery获取表单全部数据

    iQuery如何获取表单的全部数据,用于ajax提交 var formData = {}; var t = $('#Form').serializeArray(); $.each(t, functio ...

  4. 内核模式构造-Semaphore构造(WaitLock)

    internal sealed class SimpleWaitLock : IDisposable { //(信号量)允许多个线程并发访问一个资源 //如果所有线程以只读方式访问资源则是安全的 pr ...

  5. 8.CNN应用于手写字识别

    import numpy as np from keras.datasets import mnist from keras.utils import np_utils from keras.mode ...

  6. Dijkstra 优先队列优化

    #include <iostream> #include <queue> #include <vector> using namespace std; ; stru ...

  7. 第七章 路由 72 路由-路由redirect重定向的使用

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

  8. main方法类 为何由AppClassLoader加载

    AppClassLoader AppClassLoader应用类加载器,又称系统类加载器,负责在JVM启动时加载来自命令java中的classpath或者java.class.path系统属性或者CL ...

  9. jquery实现静态页面include

    最近在写一套前端页面,发现每个页面都复制一遍公共头.尾,十分不方便.于是就想能否也像PHP模板引擎一样,使用include引入公共文件,这便是接下来这段代码的意义.我们先来总结一下需求: 1.可以像使 ...

  10. 30秒钟解决MariaDB插入汉字时出现错误

    示例: create table demo( name varchar(10), sex varchar(5) )engine=innoDB default charset=utf8; 表的后面加上指 ...