程序员最在乎的两件事,你知道是什么吗?没错,一是有没有女朋友(或男朋友),二是什么编程语言是最好的。

当有人问程序员有没有女朋友时,程序员都会脸红红的,不好意思的低下头,默默的哭泣;当有人说什么编程语言是最好时,程序员都会让对方脸红红的,不好意思的低下头,默默的哭泣。

其实,编程语言没有好坏之分,只有合不合适,一味的争论,还不如了解一下编程语言排行榜。

4.1 爬语言排行榜

在网站https://www.tiobe.com/tiobe-index/上,每个月都会更新编程语言的排行,都会用表格的形式展示。在这个看颜值的时代,表格排列,不是很优美,如果能制作图形的方式,那将更受欢迎,为此,我们将爬取编程语言排行榜的数据,写入excel表格中并生成图表。

老铁,这次我们不用BeautifulSoup解析爬虫返回的结果,而改用Cython实现的高性能的lxml库,来解析xml或html。在用pip/pip3 install lxml安装之后,便可引入使用。

import requests from requests.exceptions import RequestException from lxml import etree from lxml.etree import ParseError import xlwings as xw class LangRanking: app = None wb = None sht = None def __init__(self, link): self.link = link # 创建excel文件 def open(self): self.app = xw.App(visible=True, add_book=False) # 新建工作簿 self.wb = self.app.books.add() # 页sheet1 self.sht = self.wb.sheets["sheet1"] # 单元格内容 self.sht.range("A1").value = "编程语言" self.sht.range("B1").value = "排名" # 插入数据 def insert(self, i, lang, order): # 按行输入 self.sht.range("A" + str(i)).value = lang self.sht.range("B" + str(i)).value = order def create_chart(self): chart = self.sht.charts.add(200, 10) chart.set_source_data(self.sht.range('A2').expand()) chart.width = 640 chart.height = 320 # 在当前目录下生成文件 self.wb.save("编程语言琅琊榜.xlsx") self.wb.close() self.app.quit() def get_data(self): headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36" } try: res = requests.get(self.link, headers=headers) # 解析HTML文本内容 html = etree.HTML(res.text, etree.HTMLParser()) # 定位至需要的标签 result = html.xpath('// table[ @ id = "top20"] / tbody ') self.open() index = 2 for tbody in result: tr_list = tbody.xpath('tr') for td in tr_list: lang = td[3].text num = td[0].text self.insert(index, lang, num) index += 1 self.create_chart() except RequestException: print("请求服务器异常") except ParseError: print("数据解析错误") if __name__ == '__main__': lr = LangRanking("https://www.tiobe.com/tiobe-index/") lr.get_data()

输出结果

4.2 lxml详解

lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言。它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。

1. XPath常用规则

节点名称:选取此节点的所有子节点;

/:从当前节点选取直接子节点;

//:从当前节点选取子孙节点;

.:选取当前节点;

..:选取当前节点的父节点;

@:选取属性;

* :通配符,选择所有元素节点与元素名;

@*:选取所有属性;

[@attrib] :选取具有给定属性的所有元素;

[@attrib='value']:选取给定属性具有给定值的所有元素;

[tag]:选取所有具有指定元素的直接子节点;

[tag='text']:选取所有具有指定元素并且文本内容是text节点。

2. 修护html

lxml和BeautifulSoup一样,都有修护html文件的功能。

from lxml import etree html = """

  • 老陈
  • 吹水编程
""" html = etree.HTML(html) # 初始化生成一个XPath解析对象 result = etree.tostring(html, encoding='utf-8') print(result.decode('utf-8'))

输出结果

  • 老陈
  • 吹水编程

3. 获取节点

用xpath规则,可以很容易地获取到你想要的节点内容。

from lxml import etree content = """

  • 老陈
  • 吹水编程
""" html = etree.HTML(content, etree.HTMLParser()) result = html.xpath('//a[@href="index.html"]/../@class') print(result)

输出结果

['item0']

4. 获取文本

指定节点属性,获取节点里面的文本内容。多节点的内容,在上面的爬虫程序已经提供过了,在这,就不再赘述了。

from lxml import etree content = """

  • 老陈
  • 吹水编程
""" html = etree.HTML(content, etree.HTMLParser()) result = html.xpath('//li[@class="item0"]/a/text()') print(result)

输出结果

['老陈']

好了,有关lxml解析爬虫返回html的内容,老陈讲完了,如果觉得对你有所帮助,希望老铁能转发点赞,让更多的人看到这篇文章。你的转发和点赞,就是对老陈继续创作和分享最大的鼓励。

一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,可关注今日头条:老陈说编程。分享Python,前端(小程序)、App和嵌入式方面的干货。关注我,没错的。

#Python##网络爬虫##程序员##爬虫#