利用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 组装得到,无需请求个人信息获取: 优 ...
随机推荐
- 【OCR技术系列之七】端到端不定长文字识别CRNN算法详解
在以前的OCR任务中,识别过程分为两步:单字切割和分类任务.我们一般都会讲一连串文字的文本文件先利用投影法切割出单个字体,在送入CNN里进行文字分类.但是此法已经有点过时了,现在更流行的是基于深度学习 ...
- keras 设置GPU使用率
import tensorflow as tffrom keras.backend.tensorflow_backend import set_session config = tf.ConfigP ...
- 物联网系统与CoAP之Hello,World
物联网系统与CoAP Hello,World 关于CoAP与物联网系统我们在上一篇中(ps:CoAP与物联网系统)中做一个简单的介绍,接着我们便開始试试CoAP协议的应用 CoAP应用 開始之前我们须 ...
- 【iCore4 双核心板_ARM】例程三十五:HTTP_IAP_ARM实验——更新升级STM32
实验现象: 核心代码: int main(void) { led.initialize(); //LED³õʼ»¯ key.initialize(); if(ARM_KEY_STATE == KEY ...
- Hlacon 之Image ,Region,XLD
一 读取的3种方式: read_image( image,'filename') //image 是输出对象,后面是输入文件的路径和名称 读取多图: 1,申明一个数组,分别保存路径 ImagePath ...
- Oracle分析函数-keep(dense_rank first/last)
select * from criss_sales where dept_id = 'D02' order by sale_date ; 此时有个新需求,希望查看部门 D02 内,销售记录时间最早,销 ...
- 接口和多态都为JAVA技术的核心。
类必须实现接口中的方法,否则其为一抽象类. 实现中接口和类相同. 接口中可不写public,但在子类中实现接口的过程中public不可省. (如果剩去public则在编译的时候提示出错:对象无法从 ...
- TPS和QPS的区别和理解
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准. TPS:是Transactions ...
- HttpServletResponse实现文件下载
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...
- Redis防止重複請求鎖功能
class Lock { const PREFIX_KEY = "MY_LOCK:"; static private $LOCKED = []; static public fun ...