一、lxml简介
lxml 是一个HTML/XML 的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
我们可以利用之前学习的 XPath 语法,来快速的定位特定元素以及节点信息。
安装方法:pip install lxml
二、lxml初步使用
1. 解析 HTML 字符串
from lxml import etree
text = """
<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页面内容变成element
tree = etree.HTML(text)
# print(tree)#<Element html at 0x3bfb408>
# element对象可以使用xpath()方法进行xpath选取元素,xpath方法的返回值:list
# 其实使用lxml模块解析html,他所有页面元素都会变成element对象
# 查找所有的li标签
resuslt = tree.xpath('//li')
# print(resuslt)
# 查找所有的li标签a标签的内容
a_texts = tree.xpath('//li/a/text()')
print(a_texts,"**")
# 如何将element元素变成字符串
str = etree.tostring(tree,pretty_print=True).decode('utf-8')
print(str)
2. lxml 文件读取
除了直接读取字符串,lxml 还支持从文件里读取内容。
我们新建一个 demo.html 文件。
再利用 etree.parse() 方法来读取文件。
'''
解析xml
'''
#etree使用的dom解析
from lxml import etree
tree = etree.parse('demo.xml')
# print(tree)
print(tree.xpath('//li'))
注意:从文件中读取数据,要求文件内容符合 xml 格式,如果标签缺失,则不能正常读取。
三、扇贝单词案例
爬取python常用单词:扇贝单词网:
https://www.shanbay.com/wordlist/110521/232414/
点击进入该首页,
翻页的时候查询参数规律
也可以通过F12,点击网络,点doc解析
最后我们只需要通过pycharm工具编写xpath语法去过滤筛选节点,爬取数据
import requests,random
from lxml import etree
"""代理设置"""
base_url = 'http://www.taobao.com'
# 构建代理ip列表,里面一般包含http与HTTPS两种协议的代理ip,为了适应不同的网站,
# 该模块会根据所要访问的网站的协议类型自动的选择合适的ip
procxy = [
{'https':'HTTPS://125.126.123.42:60004'},
{'https':'HTTPS://122.224.65.201:3128'},
]
# 随机选择列表中的字典,直到匹配上可以使用的ip
http = random.choice(procxy)
def get_content(url):
'''
请求获取数据
:param url:
:return:
'''
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}
response = requests.get(url,headers=headers,proxies=http,timeout=20)
return response.text
def parse_page(html_str):
'''
使用xpath提取页面数据
:param html_str: 页面字符串html内容
:return:
'''
#1、将html_str--->element对象
tree = etree.HTML(html_str)
tr_list = tree.xpath('//tr[@class="row"]')
for tr in tr_list:
#tr:包含每个单词的英文和中文
# print(tr)
word_en = tr.xpath('.//td[@class="span2"]/strong/text()')[0]
word_zh = tr.xpath('.//td[@class="span10"]/text()')[0]
item = {}
item['word_en'] = word_en
item['word_zh'] = word_zh
print(item)
# print(1,word_en)
# print(2,tree.xpath('//td[@class="span2"]/strong/text()'))
def main():
#url
base_url = 'https://www.shanbay.com/wordlist/110521/232414/?page=%s'
#分页
#经验:开发的时候测试的评率和次数都要控制,减少请求次数。
for i in range(1,4):
#发送请求获取数据
html_str = get_content(base_url % i)
# print(html_str)
#解析---xpath
parse_page(html_str)
if __name__ == '__main__':
main()