本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。
python爬虫-09-python数据提取之lxml库,让你精准提取有效数据>
lxml是一种使用Python编写的库,可以迅速、灵活地处理XML和HTML,使用XPath语法来进行文件格式解析。上一篇中我们了解了如何使用XPath找到有效数据具体的定位,但是没有提起如何在Python中使用,那么本文就将Lxml和XPath进行两者结合,让你能精准的从复杂的Html代码中提取到你想要的数据。1、Lxml安装pip install lxml或者使用国内地址进行加速下载:pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple2、介绍可以补全Html代码可以准确定位数据可以读取文件中的代码官方地址:https://lxml.de/index.html3、使用Lxml补全Html代码例如:from lxml import etreejier = """
运维家过零丁洋
惶恐滩头说惶恐,零丁洋里叹零丁。
人生自古谁无死,留取丹心照汗青。
"""suner = etree.HTML(jier)Finally = etree.tostring(suner, encoding="utf-8", pretty_print=True, method="html").decode("utf-8") # 通过编码再解码的方式可以展示中文# Finally = etree.tostring(suner) # 如果html中是存英文,就直接这样子就OK了print(Finally)输出结果如下:
运维家过零丁洋
惶恐滩头说惶恐,零丁洋里叹零丁。
人生自古谁无死,留取丹心照汗青。
可以看到它给我们自动补全了html标签,以及我们写了一半的body标签。4、从文件中读取Html代码我们新建一个ceshi.html文件,里面内容如下:
运维家过零丁洋
惶恐滩头说惶恐,零丁洋里叹零丁。
人生自古谁无死,留取丹心照汗青。
使用lxml读取:from lxml import etreejier = etree.parse('ceshi.html')suner = etree.tostring(jier)print(suner)如果使用上面的代码来读取的话会报错如下:Traceback (most recent call last): File "C:\Users\22768\Desktop\python\python爬虫\002-request+Lxml.py", line 129, in
jier = etree.parse('ceshi.html') File "src\lxml\etree.pyx", line 3536, in lxml.etree.parse File "src\lxml\parser.pxi", line 1876, in lxml.etree._parseDocument File "src\lxml\parser.pxi", line 1902, in lxml.etree._parseDocumentFromURL File "src\lxml\parser.pxi", line 1805, in lxml.etree._parseDocFromFile File "src\lxml\parser.pxi", line 1177, in lxml.etree._BaseParser._parseDocFromFile File "src\lxml\parser.pxi", line 615, in lxml.etree._ParserContext._handleParseResultDoc File "src\lxml\parser.pxi", line 725, in lxml.etree._handleParseResult File "src\lxml\parser.pxi", line 654, in lxml.etree._raiseParseError File "ceshi.html", line 6lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 4 and head, line 6, column 8Process finished with exit code 1错误提示说的是代码中,第4行有问题,经过检查之后,难不成要改成如下样子的Html代码嘛? 运维家过零丁洋
惶恐滩头说惶恐,零丁洋里叹零丁。
人生自古谁无死,留取丹心照汗青。
果然,当我们改成这样子就好了,在第4行后面添加一个斜杠。。。真是无语他妈妈给他开门。。。但是呢,我们从网页爬取的Html代码为什么要写这个反斜杠呢?本来就可以省略的嘛,难道我们爬取下来之后还要经过处理咋地,明显不现实嘛。。。然后经过我们的多次尝试之后,发现了如下的代码是可以的:from lxml import etreejier = etree.HTMLParser(encoding='utf-8')jier_2 = etree.parse('ceshi.html', parser=jier)suner = etree.tostring(jier_2, encoding="utf-8", pretty_print=True, method="html").decode("utf-8")print(suner)输出结果也是没问题的,如下: 运维家过零丁洋
惶恐滩头说惶恐,零丁洋里叹零丁。
人生自古谁无死,留取丹心照汗青。
5、在Lxml中使用XPath语法优化下我们的ceshi.html文件,让素材更加丰富,优化之后代码如下; 运维家过零丁洋
(1)获取所有li标签from lxml import etreejier = etree.HTMLParser(encoding='utf-8')jier_2 = etree.parse('ceshi.html', parser=jier)suner = etree.tostring(jier_2, pretty_print=True, method="html").decode('utf-8')jier = etree.HTML(suner)Finally = jier.xpath('//li', )for i in Finally: for a in i: if a.text == None: for b in a: print(b.text) else: print(a.text)输出结果如下:文天祥惶恐滩头说惶恐零丁洋里叹零丁人生自古谁无死留取丹心照汗青(2)获取所有li标签下的所有class属性的值from lxml import etreejier = etree.HTMLParser(encoding='utf-8')jier_2 = etree.parse('ceshi.html', parser=jier)suner = etree.tostring(jier_2, pretty_print=True, method="html").decode('utf-8')jier = etree.HTML(suner)Finally = jier.xpath('//li/@class')print(Finally)输出结果为:['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0'](3)获取最后一个li标签中的href值from lxml import etreejier = etree.HTMLParser(encoding='utf-8')jier_2 = etree.parse('ceshi.html', parser=jier)suner = etree.tostring(jier_2, pretty_print=True, method="html").decode('utf-8')jier = etree.HTML(suner)Finally = jier.xpath('//li[last()]/a/@href')print(Finally)输出结果为:['jier5.html'](4)获取倒数第二个li标签中的内容from lxml import etreejier = etree.HTMLParser(encoding='utf-8')jier_2 = etree.parse('ceshi.html', parser=jier)suner = etree.tostring(jier_2, pretty_print=True, method="html").decode('utf-8')jier = etree.HTML(suner)Finally = jier.xpath('//li[last()-1]/a')print(Finally[0].text)输出结果为:人生自古谁无死至此,本文结果,更多相关内容,每次更新。往期推荐k8s系列-14-部署Etcd集群k8s系列-05-k8s集群搭建方案对比,以及containerd是什么,如何安装k8s系列-03-认证的密码学原理之对称加密和非对称加密
暂时没有评论,来抢沙发吧~