发布时间:2023-12-14 14:30
目录
基本介绍
基本使用
案例
为什么要学习xpath?
scrapy框架支持xpath提取
selenium 经常使用xpath提取
使用简洁 语法稍稍复杂
xpath是什么?
全称 xml path language
从xml中提取数据的语言
bs4按照标签名和属性进行查找, xpath 通过路径查找 也可以按照标签名和属性进行查找,通过一个具体的获得数据
html和lxml和xml:
html 超文本标记语言
xml 可扩展标记语言
lxml python的第三方库 使用lxml下的etree模块把html转化为lxml对象
转换之后才能进行xpath提取
怎么使用?
官方文档 lxml - Processing XML and HTML with Python 英文文档
浏览器插件 chrome浏览器 xpath helper 直接在网页上就行xpath提取
# 1 安装
# pip install lxml
# 2 导包
# from lxml import etree
# 3 把html文件转为lxml对象
# xml = etree.HTML(网页源代码)
# 4 使用xpath语句进行提取
# xml.xpath(xpath语句)
from lxml import etree
xml_content = '''
aaa
bbb
bookstore
Harry Potter
aaa
333
JK.Rowing
2005
29
'''
# 把html转化为lxml对象
# 自动补全
xml = etree.HTML(xml_content)
# print(type(xml))
# / 从根节点进行选取 默认返回列表
title = xml.xpath('/html/body/bookstore/book/title')[0]
# etree.tostring(xml,encoding='utf-8') 把lxml对象转为字符串
# print(etree.tostring(xml,encoding='utf-8'))
# print(etree.tostring(title,encoding='utf-8'))
# // 从当前节点进行选取 不考虑标签的位置
# /text()取出标签内的文本
# print(xml.xpath('//bookstore//title/text()'))
# [@属性名] 查找携带lang属性的title标签
# *代表所有的标签名
# print(xml.xpath('//*[@lang]/text()'))
# print(xml.xpath('//title[@lang]/text()'))
# [@属性名='属性值']
# *可以用于代替属性名
print(xml.xpath('//*[@*="aaa"]/text()'))
# /title[2] 取出第n个title标签
print(xml.xpath('//title[1]/text()'))
# [/text()='xxxx'] 通过文本进行查找
print(xml.xpath('//*[text()="aaa"]/text()'))
# /@属性名 取出属性
print(xml.xpath('//*[text()="bookstore"]/@lang'))
# . 选取当前节点
book = xml.xpath('//book/*')
print(book.xpath('./title[1]/text()'))
# for i in book:
# print(i.xpath('./text()'))
# https://xiaohua.zol.com.cn/lengxiaohua/
# 需求 爬取标题和正文
from lxml import etree
from fake_useragent import UserAgent
import requests
def download(url):
headers = {
'user-agent': UserAgent().random
}
html = requests.get(url=url,headers=headers)
return html.text
def get_dat(html):
data_list = []
xml = etree.HTML(html)
# titile_list = xml.xpath('//span[@class="article-title"]/a[@target="_blank"]/text()')
# print(titile_list)
# text_list = xml.xpath('//div[@class="summary-text"]//text()')
# print(text_list)
# 先取大后取小
li_list = xml.xpath('//ul[@class="article-list"]/li')
for li in li_list:
title = li.xpath('.//span[@class="article-title"]/a[@target="_blank"]/text()')
# strip() 去除字符串头尾的空格 \n
# text = li.xpath('.//div[@class="summary-text"]//text()')
# 重点 推导式运用和列表脏数据清理
text = ''.join([i.strip() for i in li.xpath('.//div[@class="summary-text"]//text()')])
print(title)
print(text)
print('-'*100)
return data_list
# 获取下一页的url 没有则返回空
def get_nexturl(html):
xml = etree.HTML(html)
next_url = xml.xpath("//a[text()='下一页']/@href")
if next_url:
return 'https://xiaohua.zol.com.cn/'+next_url[0]
else:
return None
if __name__ == '__main__':
url = 'https://xiaohua.zol.com.cn/lengxiaohua/'
i = 0
while True:
html = download(url)
get_dat(html)
url = get_nexturl(html)
i += 1
print(i)
if not url:
break
自动写诗APP项目、基于python+Android实现(技术:LSTM+Fasttext分类+word2vec+Flask+mysql)第一节
51单片机+DHT11温湿度传感器+LCD1602显示(最好用的程序,没有之一)
清华教授沈向洋:创新就要做到极致,用开源的方式培养未来的工程师
【Rust日报】 2019-07-31:Debian Buster 将会预装Rust编译器
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace
【跟着大佬学JavaScript】之lodash防抖节流合并