python复习第16天:网页解析器之xpath


title: python复习第16天:网页解析器之xpath
date: 2020-04-06 23:00:24
tags:
- python
- 爬虫
categories: python复习
top: 17


Xpath 开发工具

  • 开源表达式编辑工具:XMLQuire

  • Chorme插件:Xpath Helper

  • 可以使用谷歌浏览器直接粘贴xpath路径,但是可能通用性不强

使用方法

  1. 安装lxml
pip install lxml
conda install lxml
  1. 导入etree
from lxml import etree
  1. 构建html树
from lxml import etree

text = """
<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>这是标题</title>
    </head>
    <body>
    <div style="color:#FF0000"><p>这是段落1</p> </div>
    <div style="color:#FFFF00"><p>这是段落2</p> </div>
    <div style="color:#000000"><p>这是段落2</p> </div>
    </body>
</html>
"""
html = etree.HTML(text)

选取节点

  • nodename:选取此节点的所有节点

  • /:根节点或者下一节点

result = html.xpath('/html')
print(result)
"""
[<Element html at 0x7f2448926b40>]
"""
  • // :选取节点,不考虑位置
result = html.xpath('//div')
print(result)
"""
[<Element div at 0x7f6de30e7960>, <Element div at 0x7f6de30e7910>, <Element div at 0x7f6de30e78c0>]
"""
  • . :选取当前节点
result = html.xpath('//div')
for r in result:
    s = r.xpath('./p')  # 选取当前div节点下的p节点
    print(s)
"""
[<Element p at 0x7fd70835c780>]
[<Element p at 0x7fd70835c730>]
[<Element p at 0x7fd70835c780>]
"""
  • .. :选取当前节点的父节点
result = html.xpath('//div')  # 选取div节点
for r in result:
    s = r.xpath('..')  # 选取当前节点的父节点,div的父节点是body
    print(s)
"""
[<Element body at 0x7f5d65f6f820>]
[<Element body at 0x7f5d65f6f820>]
[<Element body at 0x7f5d65f6f820>]
"""
  • @:选取属性
result = html.xpath('//div[@style="color:#FF0000"]')  # 选取div节点,其中style = "color:#FF0000"
print(result)
"""
[<Element div at 0x7f6673d7b9b0>]
"""
  • / :一般安装路径查找,表示它的子节点
  • // :表示它的后代,包括子、孙

提取属性或者文本

  • text():提取当前节点的文本
result = html.xpath('//div/p/text()')  # 选取//div/p下的文本
print(result)
"""
['这是段落1', '这是段落2', '这是段落2']
"""
  • string(.):提取当前节点以及子孙节点的所有文本
result = html.xpath('string(.)')
print(result)
"""

    
        
        这是标题
    
    
    这是段落1 
    这是段落2 
    这是段落2 
    


"""
  • @:提取某个属性,以提取百度官网的所有url为例
import requests
from lxml import etree
from pprint import pprint
import re
url = 'https://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)\
     Chrome/80.0.3987.149 Safari/537.36'
}
response = requests.get(url, headers=headers)
text = response.text
html = etree.HTML(text)
result = html.xpath('//a/@href')  # 选取所有a节点下的链接
p = re.compile('http.?://.*?')  # 编写正则表达式,提取http或者https开头的网页
list2 = []
for r in result:
    result2 = p.match(r)  # 检测是否匹配
    if result2:  # 如果匹配
        list2.append(r)
pprint(list2)
"""
['https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5',
 'https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_pc_1',
 'http://news.baidu.com',
 'https://www.hao123.com',
 'http://map.baidu.com',
 'http://v.baidu.com',
 'http://tieba.baidu.com',
 'http://xueshu.baidu.com',
 'https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F&sms=5',
 'http://www.baidu.com/gaoji/preferences.html',
 'http://www.baidu.com/more/',
 'http://ir.baidu.com',
 'http://e.baidu.com/?refer=888',
 'http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001',
 'http://tieba.baidu.com/f?kw=&fr=wwwt',
 'http://zhidao.baidu.com/q?ct=17&pn=0&tn=ikaslist&rn=10&word=&fr=wwwt',
 'http://music.taihe.com/search?fr=ps&ie=utf-8&key=',
 'http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=',
 'http://v.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&ie=utf-8&word=',
 'http://map.baidu.com/m?word=&fr=ps01000',
 'http://wenku.baidu.com/search?word=&lm=0&od=0&ie=utf-8']
"""

谓语-Predicates

  • /School/Student[1] :选取School下面第一个节点
  • /School/Student[last()] : 选取School下面最后一个节点
  • /School/Student[position()<3] : 选取School下面前三个节点
  • //Student[@score="99"] 选取属性带有99的节点

Xpath运算符

运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有拥有 book 和 cd 元素的节点集
+ 加法 6 + 4 10
- 减法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。
!= 不等于 price!=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
< 小于 price<9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
<= 小于或等于 price<=9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
> 大于 price>9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
>= 大于或等于 price>=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。
or price=9.80 or price=9.70 如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。
and price>9.00 and price<9.90 如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。
mod 计算除法的余数 5 mod 2 1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • ···lxml用法源自 lxml python 官方文档,更多内容请直接参阅官方文档,本文对其进行翻译与整理。lx...
    小丰丰_72a2阅读 952评论 0 1
  • 学习自刘大拿的Python课程 XPath 在XML文件中查找信息的一套规则/语言,根据XML的元素或者属性进行遍...
    嗒嘀嗒嗒嘀嗒嘀嘀阅读 334评论 0 1
  • XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历,而将...
    哈耶卡卡阅读 4,893评论 0 1
  • 关于写作,我还是过于稚嫩,没有流畅的线条,没有清晰的思路。 思绪在哪,文章就跨越到哪。 这是一个硬伤,对于没写过类...
    舞鎏殇阅读 243评论 2 1
  • 周日预告:你认真定义过什么是知识吗? 能改变你行为才叫知识,否则这些知识对你来说知识一些信息和数据而已。我每天急于...
    路人夏阅读 258评论 0 0