利用python脚本(xpath)抓取数据
有人会问re和xpath是什么关系?如果你了解js与jquery,那么这个就很好理解了。
# -*- coding:utf-8 -*-
from lxml import etree html = """
<!DOCTYPE html>
<html>
<head lang="en">
<title>我的文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div id="cctv">
<div class="content">
<ul id="ul">
<li>NO.1</li>
<li>NO.2</li>
<li>NO.3</li>
</ul>
<ul id="ul2">
<li><span class="ctv">one</span></li>
<li><span class="ctv">two</span></li>
</ul>
</div>
<div id="url">
<a href="http://www.jd.com" title="jd">jd</a>
<a href="http://www.360buy.com" title="360buy">360buy</a>
</div>
</div>
</body>
</html>
"""
selector = etree.HTML(html) # ########### example 1 ############
# 这里使用id属性来定位哪个div和ul被匹配 使用text()获取文本内容
# 这里注意要层层匹配
# content = selector.xpath('//div[@id="cctv"]/div[@class="content"]/ul[@id="ul"]/li/text()')
# content = selector.xpath('//div[@id="cctv"]/div[@class="content"]/ul[@id="ul2"]/li/span[@class="ctv"]/text()')
content = selector.xpath('//a/@href') for i in content:
print(i)
print(u"************ 华丽分割符1 ************") # ########### example 2 ############
# 使用绝对路径定位a标签的title
con = selector.xpath('/html/body/div/a/@title')
# 使用相对路径定位 两者效果是一样的
con = selector.xpath('//a/@title')
print(len(con))
print(con[0], con[1])
print(u"************ 华丽分割符2 ************") # ########### example 3 ############
# starts-with 解决标签属性值以相同字符串开头的情况
con2 = selector.xpath('//span[starts-with(@class,"c")]/text()') # 这里使用starts-with方法提取div的id标签属性值开头为a的div标签
for i in con2:
print(i)
print(u"************ 华丽分割符3 ************") # string(.) 标签套标签
html2 = '''
<div id="a">
left
<span id="b">
right
<ul>
up
<li>down</li>
</ul>
east
</span>
west
</div>
''' # 下面是没有用string方法的输出
selector2 = etree.HTML(html2)
con3 = selector2.xpath('//div[@id="a"]/text()')
for i in con3:
print(i)
print(u"************ 华丽分割符4 ************") # 下面使用string方法的输出
data = selector2.xpath('//div[@id="a"]')
# info = data[0].xpath('string(.)').extract()[0]
info = data[0].xpath('string(.)')
con4 = info.replace('\n', '').replace(' ', '')
for i in con4:
# python 输出结果默认是\n,换行,将结尾替换掉即可实现不换行。
print(i, end='')
print("\r")
print(u"************ 华丽分割符5 ************") # ########### example 4 ############
html3 = """
<div>hello
<p>H</p>
</div>
<div>hehe</div>
"""
selector3 = etree.HTML(html3)
# 使用text()的方法来判别是哪个div标签
con5 = selector3.xpath('//div[text()="hehe"]/text()')
print(con5[0])
print(u"************ 华丽分割符6 ************") # ########### example 5 ############
html4 = """
<div id="utv">hello
<p>H</p>
<p>J</p>
<p>I</p>
</div>
<div>hehe</div>
"""
selector4 = etree.HTML(html4)
# 在XPath中可以使用多重过滤方法寻找标签,例如ul[3][@id=”a”] 这里使用【3】来寻找第三个ul标签 并且它的id属性值为a
con6 = selector4.xpath('//div/p[position()>=2]/text()')
for i in con6:
print(i)
print(u"************ 华丽分割符7 ************")
利用python脚本(xpath)抓取数据的更多相关文章
- 爬虫学习笔记(1)-- 利用Python从网页抓取数据
最近想从一个网站上下载资源,懒得一个个的点击下载了,想写一个爬虫把程序全部下载下来,在这里做一个简单的记录 Python的基础语法在这里就不多做叙述了,黑马程序员上有一个基础的视频教学,可以跟着学习一 ...
- 如何利用Python网络爬虫抓取微信朋友圈的动态(上)
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...
- 利用Python网络爬虫抓取微信好友的签名及其可视化展示
前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...
- 如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例
前几天给大家分享了利用Python网络爬虫抓取微信朋友圈的动态(上)和利用Python网络爬虫爬取微信朋友圈动态——附代码(下),并且对抓取到的数据进行了Python词云和wordart可视化,感兴趣 ...
- 利用Python网络爬虫抓取微信好友的所在省位和城市分布及其可视化
前几天给大家分享了如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,感兴趣的小伙伴可以点击链接进行查看.今天小编给大家介绍如何利用Python网络爬虫抓取微信好友的省位和城市,并且将 ...
- 利用python scrapy 框架抓取豆瓣小组数据
因为最近在找房子在豆瓣小组-上海租房上找,发现搜索困难,于是想利用爬虫将数据抓取. 顺便熟悉一下Python. 这边有scrapy 入门教程出处:http://www.cnblogs.com/txw1 ...
- Python爬虫处理抓取数据中文乱码问题
乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了. ...
- 怎么用Python写爬虫抓取网页数据
机器学习首先面临的一个问题就是准备数据,数据的来源大概有这么几种:公司积累数据,购买,交换,政府机构及企业公开的数据,通过爬虫从网上抓取.本篇介绍怎么写一个爬虫从网上抓取公开的数据. 很多语言都可以写 ...
- Python 3.6 抓取微博m站数据
Python 3.6 抓取微博m站数据 2019.05.01 更新内容 containerid 可以通过 "107603" + user_id 组装得到,无需请求个人信息获取: 优 ...
随机推荐
- find ctime 加减n时间范围
看下atime的时间解释:-atime n File was last accessed n*24 hours ago. When find figures out how many 24-hour ...
- 使用.gitignore删除Github上的.idea文件
环境:windows + git bash. 一.问题来源 由于之前用Goland建立Golang工程时,生成了.idea文件,不小心上传至Github: 所以尝试用.gitignore进行忽略不上传 ...
- PXE(preboot execution environment):【网络】预启动执行环节:安装 debian 9系列:成功
PXE 安装的必要点和之前一样. 这里只着重说一下debian系列 特殊的地方: 第一:Release.gpg问题 该问题解决方式一:要求官方的dvd.cd中提供,貌似不太可能实现...... 该问题 ...
- 抖音圈圈乐 系统搭建H5微信小游戏圈圈乐系统介绍
网红线下游戏抖音圈圈乐改造而来 一.搭建此系统需要准备如下资料: 1. 认证微信服务号 2. 微信支付商户号 3. 备案域名及云服务器 二.系统功能简介: 1. 游戏闯关 2. 每个商品闯关难度后台自 ...
- easyui的tree节点的获取和选中
1.设置选中tree的节点 var node = $('#tt').tree('find', 1);//找到id为”tt“这个树的节点id为”1“的对象$('#tt').tree('select', ...
- a,abbr,address,area,article, aside, audio标签文档
<a>标签 download属性 <!-- 下载hello.txt --> <a href="test.txt" download="hel ...
- PXC 57 二进制安装
1.准备阶段 1.1 在三个节点上分别创建:用户组 用户组 目录 --用户组 用户组 #/usr/sbin/groupadd mysql #/usr/sbin/useradd -g mysql mys ...
- 【Java核心技术】类型信息(Class对象 反射 动态代理)
1 Class对象 理解RTTI在Java中的工作原理,首先需要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息.Class对象就是用来创建所有“常规”对象的,J ...
- 11.vue 数据交互
vue new Vue({ el,选择器 string/obj 不能选择html/body data, methods, template string/obj //生命周期 -- 虚拟DOM 1.初 ...
- Maven setting.xml 文件配置
全局配置: ${M2_HOME}/conf/settings.xml (配置环境变量 新建 M2_HOME 安装目录到版本名那里(D:\apache-maven-3.0.2) 编辑path 环 ...