利用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 组装得到,无需请求个人信息获取: 优 ...
随机推荐
- 流媒体之HLS——综述
[时间:2018-01] [状态:Open] [关键词:流媒体,stream,HLS] 0 HLS背景及初衷 HLS是由苹果公司发起的流媒体网络传输协议,可参考rfc8261 HTTP Live St ...
- phpunit assert断言分类整理
布尔类型 方法名 含义 参数 返回值 assertTrue 断言为真 assertFalse 断言为假 NULL类型 方法名 含义 参数 返回值 assertNull 断言为NULL ...
- Virtual配置
没有ifconfig yum upgrade yum install net-tools yum源配置: https://jingyan.baidu.com/article/215817f7aef2e ...
- docker容器运行与退出
#下载centos镜像,运行一个名为mycentos的容器,并在容器里运行/bin/bash docker run -ti --name mycentos centos /bin/bash #退出 e ...
- 关于Unity中摇杆的操作
之前在解决摇杆控制角色的时候使用的是RPG游戏中主角的运动方式,有八个方向,最近找到一个新的方法,可以比较流畅地控制角色各个方向的移动 步骤 1.Easy Touch插件,角色控制器组件 2.在控制角 ...
- linux环境,通过rpm删除mysql包,报错:error reading information on service mysqld: Invalid argument
问题描述: 今天在做saltstack的练习,想要通过sls的方式,在远程进行mysql数据库的安装,发现无法通过service的方式启动数据库,然后就想给删除了重新进行安装,在通过rpm -e进行删 ...
- 智能聊天机器人——基于RASA搭建
前言: 最近了解了一下Rasa,阅读了一下官方文档,初步搭建了一个聊天机器人. 官方文档:https://rasa.com/docs/ 搭建的chatbot项目地址: https://github.c ...
- puppet(5)-master/agent模式
master/agent模式的工作流程 agent每隔固定时长会向master端发送nodename(自己的节点名,节点名至关重要)和 facts ,并且向服务器端请求自己的catalog. mast ...
- 使用glusterfs 作为 kubernetes PersistentVolume PersistentVolumeClaim 持久化仓库,高可用Rabbitmq,高可用mysql,高可用redis
glusterfs 怎么集群,网上一搜铺天盖地的 可利用这个特点做单节点高可用,因为K8S 哪怕节点宕机了 master 会在随意一台节点把挂掉的复活 当然我是在自己的环境下跑,经过网络的gluste ...
- python数据分析及展示(一)
一.IDE选择 Anaconda软件:开源免费,https://www.anaconda.com下载,根据系统进行安装.由于下载速度慢,可以去清华大学开源软件镜像站下载. Spyder软件设置:Too ...