lxml解析网页
阅读原文时间:2023年07月12日阅读:2

目录

1. 什么是lxml

lxml是干什么的?简单的说来,lxml是帮助我们解析HTML、XML文件,快速定位,搜索、获取特定内容的Python库。我们知道,对于纯文本的HTML文件的查找可以使用正则表达式BeautifulSoup等完成。lxml也是对网页内容解析的一个库。

那么为什么要用lxml呢?据听说他比较快。我没有用来做过大项目,对解析速度理解不是很深刻。我用lxml只是因为它似乎比BeautifulSoup好用。

2. 初次使用

  1. 安装

    sudo pip3 install lxml

  2. 初次使用

    导入lxml

    from lxml import etree

    html字符串

    html_str = """

    demo

    1111111



    """

    利用html_str创建一个节点树对象

    html = etree.HTML(html_str)
    type(html) # 输出结果为:lxml.etree._Element

  3. 首次解析HTML

不用理会下面代码中出现的新的方法和各种解析的技巧。先看一下lxml如何快速方便的解析html.

# 我们现在要获得上面的html文件中的p标签的内容
p_str = html.xpath('//body/p/text()')  # 返回结果为一个列表:['1111111']

上面的例子,给出一个lxml如何解析HTML文件的实例。后文中众多的知识点,只不过是讲解更多的xpath解析方法技巧。

3. xpath

我们一直再讲lxml,这里突然出现xpath是干什么的?lxml的主要功能是解析HTML,他是利用什么语法来解析HTML的呢?就是利用xpath,因此,我们需要了解如何使用xpath。

xpath将html文档看做一个有众多的节点按照特定级别组织的节点树,对于其中内容的解析,又三种主要的措施:

  1. 标签定位
  2. 序列定位
  3. 轴定位

很抱歉,我们又引入了新的概念。但现在我们解释这些概念是不明智的,还是先看一下如何使用。

为了说明xpath各种定位语法,我们下面利用如下的HTML来完成讲解。

from lxml import etree

html_str = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>The Document's story</title>
</head>
<body>
    <div class="table1">
        <ul class="one" id="id1">
            <tr>tr1</tr>
            <tr>tr2</tr>
            <tr>tr3</tr>
            <tr>tr4</tr>
        </ul>
        <ol class="two" id="id2">
            <td>td1</td>
            <td>td2</td>
            <td>td3</td>
            <td>td4</td>
        </ol>
    </div>
    <div class="table2">
        <a href="www.table2_1.com"><span>table2_span</span></a>
        <a href="www.table2_2.com">
            <p><h2>TABLE2</h2></p>
        </a>
        <a href="www.table2_3.com" id="id3">
                <ul class="table_one" id="id4">
                    <tr>tr1_a</tr>
                    <tr>tr2_a</tr>
                    <tr>tr3_a</tr>
                    <tr>tr4_a</tr>
                </ul>
        </a>
    </div>
</body>
</html>
"""

html = etree.HTML(html_str)
html.xpath('//*') # 请将'//*'替换成下面表中实例列的表达式以观察各表达式的含义和作用。

先给出一张表。下表中给出了标签定位的表达式和对其作用的描述。下表中,实例列中的表达式的全部表达如下:如第一行中的命令为'//div',则全部的表达式为html.xpath('//div') 。注意,这里的html是一个lxml.etree._Element对象。(我们用HTML表示HTML文件或者其对应的字符串。)

表达式

描述

实例

解释

nodename

选取此节点的所有子节点

'//div'

找到html树中的所有div标签

/

从根节点选取

'/head/title'

从根节点找到head->title

//

选取任意位置的某个节点

'//'

html中所有p标签

.

选取当前节点

'.'

返回当前节点对象

..

选取当前节点的父节点

'/html/head/..'

返回head的父节点html

@

选取属性

'//div[@class="one"]'

返回具有属性class,并且class的值为"one"的节点

*

通配符

'//div/*'

返回所有满足条件的节点

|

一次选择多个路径

'/html/head | //div'

返回head节点或者div节点

@*

选取所有属性

'//div[@*]'

返回所有具有属性的div对象

通过上面的学习,我们知道html.xpath()返回的是一个包含节点树对象的列表,对于列表中的元素,我们可以按照列表的索引进行查找,但是,如果想在xpath里面进行选择,就需要使用序列定位。

下面的代码承接上文。在给出一张表。

谓语

描述

实例

解释

[1]

第一个元素

'//div[1]'

返回第一个div对象

[last()]

最后一个元素

'//div[last()]'

返回最后一个div对象

[last()-1]

倒数第二个元素

'//div/ul[1]/tr[last()-1]'

返回所有div对象中第一个ul对象下面的倒数第二个tr对象

[position()❤️]

最前面的两个元素

'//tr[position()❤️]'

返回前两个tr对象

[@lang]

所有拥有属性lang的元素

'//div[@class]'

返回具有calss属性的div

[@lang='en']

所有lang='en'的元素

'//div[@class="en"]'

返回class属性值为en的div对象

同上。

轴名称

描述

实例

解释

child

当前节点的所有子元素

'//div[1]/child:

  1. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 …

  2. python网络爬虫-解析网页(六)

    解析网页 主要使用到3种方法提取网页中的数据,分别是正则表达式.beautifulsoup和lxml. 使用正则表达式解析网页 正则表达式是对字符串操作的逻辑公式 .代替任意字符 . *匹配前0个或多 …

  3. 用Xpath选择器解析网页(lxml)

    在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa …

  4. Beautiful Soup解析网页

    使用前步骤: 1.Beautiful Soup目前已经被移植到bs4,所以导入Beautiful Soup时先安装bs4库. 2.安装lxml库:如果不使用此库,就会使用Python默认的解析器,而l …

  5. 网络爬虫之Selenium模块和Xpath表达式+Lxml解析库的使用

    实际生产环境下,我们一般使用lxml的xpath来解析出我们想要的数据,本篇博客将重点整理Selenium和Xpath表达式,关于CSS选择器,将另外再整理一篇! 一.介绍: selenium最初是一 …

  6. bs4——BeautifulSoup模块:解析网页

    解析由requests模块请求到的网页 import requests from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/ …

  7. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 …

  8. python网络爬虫之解析网页的XPath(爬取Path职位信息)[三]

    目录 前言 XPath的使用方法 XPath爬取数据 后言 @(目录) 前言 本章同样是解析网页,不过使用的解析技术为XPath. 相对于之前的BeautifulSoup,我感觉还行,也是一个比较常用 …

  9. Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. ​ 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存 …

  10. 用JavaScript做一個簡單的計算器

    今天繼續學習JavaScript,視頻講的確實挺差勁的.還是只能跟著W3School自己慢慢摸索著弄了.自己百度了一下,參考了一個大佬寫的一個簡單的計算器代碼.代碼能跑通,但是做出來的樣子實在是感覺太 …

  11. 嗨,你真的懂this吗?

    this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JvaScript开发者并不是非常清楚它究竟指向的是什么.听说你很懂this,是 …

  12. stixel_world+Multi_stioxel_world+semantic_stixel_world知识拓展

    Semantic_Stixel_World 学习笔记 因项目方向更改,该研究暂停, 转为opengl等3D渲染. Author: Ian 星期四, 20. 六月 2019 06:11下午 最近看网络上 …

  13. 使用gulp构建微信小程序工作流

    前言 刚入门微信小程序的时候,一切都基于微信web开发者工具,没有使用其他框架,也没有工程化的概念.当时做的项目都比较简单,单单用微信web开发者工具倒也得心应手.学了些东西后,就按捺不住地想跳出原生 …

  14. 【题解】【合并序列(水题)P1628】

    原题链接 这道题目如果连字符串的基本操作都没学建议不要做. 学了的很简单就可以切,所以感觉没什么难度- 主要讲一下在AC基础上的优化(可能算不上剪枝) 很明显,这道题我们要找的是前缀,那么在字符串数组 …

  15. 跨站脚本攻击(selfxss)笔记(三)

    本篇纯文字发表自己对自插型xss的看法 selfxss,顾名思义,自己输入xss脚本,输出仅自己看到,仅xss到自己. 常见的有:查询框的xss.某个账号中,添加自己的分组类等 查询框的xss: 即在 …

  16. 运用KeyCode在浏览器中按WASD使图形运动

    如何实现在浏览器中按WASD四个键使图形上下左右运动呢? 其实很简单,用keyCode方法就可以实现了. 先放个div在html中: <div id="ball" style …

  17. centos7 安装NVM 管理node

    [转载] 转载自https://blog.csdn.net/shuizhaoshui/article/details/79325931 NVM git地址: https://github.com/cr

  18. 林大妈的JavaScript基础知识(一):JavaScript简史

    前言:做一名Web设计师是一件令人兴奋的事.在Web技术中,JavaScript是一个经历从被人误解到万众瞩目的巨大转变,在历史的冲击中被留存下来的个体.因为JavaScript的引导,Web开发也从 …

  19. C#托盘程序设置

    打开Microsoft Visual Studio 2010,新建解决方案--添加项目--托盘的实现     从工具栏里,把NotifyIcon控件拖到窗体上,并设置属性: 1.visible 设置默 …

热门专题

miniui 破解版

IDEA中学生激活时间延长

s3NgHl9V2zNmⅤvMP

xlwings 把dataFrame写入表格中

named 局域网 外网冲突

单线程每秒处理多少数据比较合理

docker bufferedreader 中文 问号

plugin-container关闭

R语言 igraph 计算度

inno setup检测已安装版本

wingide远程连接服务器

vscode彻底删除插件

c语言数组的注意事项

如何checkout别人提交的pr

驱动CR3大法强制读进程内存

intel ssd e9磨损

python修改文件某一行循环

coreldrawx8V18破解

apisix 性能对比

Winform下透明Panel

Home

Powered By WordPress

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器