首页 > 编程语言 >Python通过Lxml库解析网络爬虫抓取到的html

Python通过Lxml库解析网络爬虫抓取到的html

时间:2024-02-11 21:33:36浏览次数:25  
标签:Lxml Python 标签 html item lxml print data

Lxml是基于 libxml2解析库的Python封装。libxml2是使用C语言编写的,解析速度很好,不过安装起来稍微有点复杂。安装说明可以参考(http: //Lxml.de/installation.html),在CentOS7上中文安装说明(http://www.cjavapy.com/article/64/),使用lxml库来解析网络爬虫抓取到的HTML是一种非常高效的方式。lxml的html模块特别适合处理HTML内容,它可以快速解析大型HTML文件,并提供XPath和CSS选择器来查询和提取数据。

参考文档:Python通过Lxml库解析网络爬虫抓取到的html-CJavaPy

一、可能不合法的html标签解析

从网络上抓取到的html的内容,有可能都是标准写法,标签什么的都闭合,属性也是标准写法,但是有可能有的网站的程序员不专业,这样抓到的html解析就有可能有问题,因此,解析时先将有可能不合法的html解析为统一的格式。避免为后续的解析造成困扰。

1、lxml.html

lxml.html是专门用于解析和处理HTML文档的模块。它基于lxml.etree,但是为HTML文档的特点做了优化。lxml.html能够处理不良形式的HTML代码,这对于解析和爬取网页尤其有用。

>>> import lxml.html
>>> broken_html = '<ul class="body"><li>header<li>item</ul>'
>>> tree = lxml.html.fromstring(broken_html) #解析html
>>> fixed_html = lxml.html.tostring(tree,pretty_print=True)
>>> print fixed_html
<ul class="body">
<li>header</li>
<li>item</li>
</ul>

2、lxml.etree

lxml.etreelxml库中用于处理XML文档的模块。它基于非常快的XML解析库libxml2,提供了一个类似于标准库xml.etree.ElementTreeAPI的接口,但是在性能和功能性方面要更加强大。lxml.etree支持XPath、XSLT、和Schema验证等高级XML特性。

>>> import lxml.etree
>>> broken_html = '<ul class="body"><li>header<li>item</ul>'
>>> tree = lxml.etree.fromstring(broken_html) #解析html
>>> fixed_html = lxml.etree.tostring(tree,pretty_print=True)
>>> print fixed_html
<ul class="body">
<li>header</li>
<li>item</li>
</ul>

通过以上可以看出,lxml可以正确解析两侧缺失的括号,并闭合标签,但不会额外增加<html><body>标签。

二、处理lxml解析出来的html内容

若在html中找到我们想要的内容,用lxml有几种不同的方法,XPath选择器类似Beautiful Soup的find()方法。CSS选择器用法和jQuery中的选择器类似。两种选择器都可以用来查找文档中的元素,但它们各有特点和适用场景。XPath是一种在XML文档中查找信息的语言。它可以用来遍历XML文档的元素和属性。CSS选择器通常用于选择和操作HTML文档中的元素。

1、XPath选择器(/单斜杠表示绝对查找,//双斜杠表示相对查找)

from lxml import etree
source_html = """
         <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
         </div>
        """
html = etree.HTML(source_html)
print(html)
result = etree.tostring(html)#会对的html标签进行补全
print(result.decode("utf-8"))

输出结果:

<Element html at 0x39e58f0>
<html><body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div>
</body></html>

1)获取某个标签的内容(a标签后不需要加斜杠,否则会报错)

#第一种写法

html = etree.HTML(source_html)
html_data = html.xpath('/html/body/div/ul/li/a')#绝对查找
#html_data = html.xpath('//li/a')#相对查找
print(html)
for i in html_data:
    print(i.text)

输出结果:

<Element html at 0x14fe6b8>
first item
second item
third item
fourth item
fifth item

#第二种写法
#在要找的标签后面加/text(),就是获取标签中的文本内容,结果中直接就是文本内容了,不用在通过text属性获取了。

html = etree.HTML(source_html)
html_data = html.xpath('/html/body/div/ul/li/a/text()')#绝对查找
#html_data = html.xpath('//li/a/text()')#相对查找
print(html)
for i in html_data:
    print(i)

输出结果:

<Element html at 0x128e3b7>
first item
second item
third item
fourth item
fifth item

2)获取a标签下的属性

html = etree.HTML(source_html)
html_data = html.xpath('//li/a/@href') #相对查找
#html_data = html.xpath('/html/body/div/ul/li/a/@href') #绝对查找
for i in html_data:
    print(i)

输出结果:

link1.html
link2.html
link3.html
link4.html
link5.html

3)查找a标签属性等于link2.html的内容

html = etree.HTML(source_html)
html_data = html.xpath('/html/body/div/ul/li/a[@href="link2.html"]/text()')绝对查找
#html_data = html.xpath('//li/a[@href="link2.html"]/text()')#相对查找
print(html_data)
for i in html_data:
    print(i)

输出结果:

['second item']
second item

4)查找最后一个li标签里的a标签的href属性

html = etree.HTML(source_html)
html_data = html.xpath('//li[last()]/a/text()')
print(html_data)
for i in html_data:
    print(i)

输出结果:

['fifth item']
fifth item

5)查找倒数第二个li标签里a标签的href属性

html = etree.HTML(source_html)
html_data = html.xpath('//li[last()-1]/a/text()')
print(html_data)
for i in html_data:
    print(i)

输出结果:

['fourth item']
fourth item

6)查找某个标签id属性值等于value的标签

//*[@id="value"]

7)使用chrome浏览器提取某个标签的XPath

​编辑

2、CSS选择器(基本上和jQuery选择器用法一样) 

选择器描述
* 选择所有标签
a 选择<a>标签
.link 选择所有class = 'link'的元素
a.link 选择class = 'link'的<a>标签
a#home 选择id = 'home'的<a>标签
a > span 选择父元素为<a>标签的所有<span>子标签
a span 选择<a>标签内部的所有<span>标签

使用示例:

>>> html = """<div>
<tr id="places_area_row" class="body">
<td>header</td>
<td class="w2p_fw">item1</td>
<td class="w2p_fw">item2</td>
<td class="w2p_fw">item3</td>
<td><tr><td class="w2p_fw">header</td>
<td class="w2p_fw">item4</td>
<td class="w2p_fw">item5</td>
<td class="w2p_fw">item6</td></tr></td>
</tr>
</div>"""
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect('tr#places_area_row > td.w2p_fw')[0]
>>> htmlText = td.text_content()
>>> print htmlText
item1

 参考文档:Python通过Lxml库解析网络爬虫抓取到的html-CJavaPy

标签:Lxml,Python,标签,html,item,lxml,print,data
From: https://www.cnblogs.com/tinyblog/p/18013545

相关文章

  • python基础学习4
    异常处理try-excepttry-except-excepttry-except-except-elsetry-except-except-else-finally:raise关键字raiseException('自定义异常')异常类型ZeroDivisionError除数为零IndexError索引超出范围KeyError字典取值时key不存在NameError使用未声明变量Sy......
  • 八、Python开发环境管理
    AnacondaAnaconda介绍、安装及使用教程-知乎(zhihu.com)如果你已经安装了Anaconda,那么就不再需要再安装Python了。Anaconda是一个集成了Python和大量常用Python库的发行版,它内置了Python环境和多种常用的Python库,可以直接使用。安装Anaconda后,你就可以在命令......
  • Python--变量和简单数据类型
    Python--变量和简单数据类型变量的命名和使用1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message。1_message="helloworld"#错误写法message_1="helloworld"#正确写法2.变量名不能......
  • 第 7章 Python 爬虫框架 Scrapy(上)
    第7章Python爬虫框架Scrapy(上)编写爬虫可以看成行军打仗,基本的角色有两个:士兵和将军,士兵冲锋陷阵,而将军更多地是调兵遣将。框架就像一个将军,里面包含了爬虫的全部流程、异常处理和任务调度等。除了可以让我们少写一些烦琐的代码,学习框架还可以学到编程思想和提升编程能力。Pyt......
  • python3创建虚拟环境
    在Python3中创建虚拟环境,你可以使用venv模块。venv模块是Python3.3及更高版本中自带的,用于创建独立的Python环境。以下是创建虚拟环境的步骤:打开终端或命令提示符。导航到你想要创建虚拟环境的目录。运行以下命令创建虚拟环境:python3-mvenvmyenv这将创建一个名为myen......
  • 用 python 比较 椭球体、单叶双曲面、双叶双曲面
    2024年2月10日 昨天晚上年夜饭,也算是道出这几年的麻烦——就是内心戏多,加上身边又没有太多的案例(或者更多人)让我的认知有个比较客观的校准。现在就学习吧。尝试用Python画出椭球体、单叶双曲面、双叶双曲面。 1.椭球面 代码#----Test-----#椭球,单叶双曲......
  • 第 6章 Python 应对反爬虫策略
    第6章Python应对反爬虫策略爬取一个网站的基本步骤(1)分析请求:URL规则、请求头规则、请求参数规则。(2)模拟请求:通过Requests库或urllib库来模拟请求。(3)解析数据:获取请求返回的结果,利用lxml、BeautifulSoup或正则表达式提取需要的节点数据。(4)保存数据:把解析的数据持......
  • python3.9+django4.1+vue3 ,后端项目运行时,报错了,WSGI application 'XXX.wsgi.applicat
    python3.9+django4.1+vue3,后端项目运行时,报错了; 报错信息,如下:django.core.exceptions.ImproperlyConfigured:WSGIapplication'StudentMgrBE.wsgi.application'couldnotbeloaded;Errorimportingmodule.     ------------------------------百度......
  • python基础复习
    四大数据类型1.列表(List)列表是有序的集合,可以包含任意类型的对象:数字、字符串甚至其他列表。列表是可变的(Mutable),意味着可以在创建后添加、移除或改变元素。使用方括号[]定义,元素之间用逗号,分隔。示例:my_list=[1,"Hello",3.14,[2,4,6]]2.元组(Tuple)元组也是有......
  • Python实现视频片头和片尾添加(不实用)
    参考的原代码,运行提示:RuntimeError:imageio.ffmpeg.download()hasbeendeprecated.Use'pipinstallimageio-ffmpeg'instead.'直接删除掉这行:imageio.plugins.ffmpeg.download()改为:importimageiofromdatetimeimportdatetimeimportosfrommoviepy.video.......