一、需求
此代码是学习波波老师python爬虫教学视频后所记笔记
对应视频: 波波老师B站视频[P24] 对应up为:路飞学城IT
笔记概要:
在各种情形下使用xpath获取数据的应用示例与解释,解释写在同行示例后面的备注里。
二、代码
1. 引入库
# -*- codeing = utf-8 -*-
# @Time: 2020/12/30 3:55
# @Author: Si
# @File: test_xpath解析01.py
# @Software: PyCharm
from lxml import etree
2. 示例代码
def main():
headers = {
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64;x64;rv: 84.0) Gecko / 20100101 Firefox / 84.0"
}
#实例化好一个etree对象,并将被解析的数据加载进去
parser = etree.HTMLParser(encoding='utf-8') #在使用etree.parse时报错,原因:该方法默认使用的是“XML”解析器,所以如果碰到不规范的html文件时就会解析错误
tree = etree.parse('baidu.html',parser=parser) #所以需要自己创建html解析器,增加parser参数
r = tree.xpath('/html/head/title') # / 表示从根节点开始定位,一个 / 表示一个层级
r = tree.xpath('/html/body/div')
r = tree.xpath('/html//div') # // 表示多个层级
r = tree.xpath('//div') # // 可以从任意层级开始定位
r = tree.xpath('//div[@class="s_tab"]') # 属性定位://div[@class="s_tab"] tag[@attrName="attrValue"] attribute属性
r = tree.xpath('//div[@class="s_tab"]/p[3]') # 索引定位://div[@class="s_tab"]/p[3] 符合属性条件的div下的第三个p标签,索引是从1开始计数的
r = tree.xpath('//div[@class="s_tab"]//li[5]/a/text()')[0] #取文本: text()取到的,是以列表形式存储的,只有一个值,所以最后要用[0]来得到字符串形式的数据
r = tree.xpath('//li[7]/text()') #text()只获得li标签直系的文本,如果此时是想要li标签下的子标签的文本,而非li标签的直系文本,那么就什么也得不到
r = tree.xpath('//li[7]//text()') #所以用双杠 //text(),而不是单杠 /text(),注意直系文本与子标签下文本的区分
r = tree.xpath('//div[@class="s_tab"]//text()') #取一个标签下所有文本,但是,同时会把 \n \t 这样的空格和回车也取出来,因为这也算文本
r = tree.xpath('//div[@class="s_tab"]/img/@src') #取属性值:/@attrName,这样把img标签下的src属性提取了出来,是个jpg网址
print(r)
if __name__ == '__main__':
main()
print('over')
结语
如果对代码有疑问或其他问题,欢迎评论告诉我,我会常来看 (毕竟面向CSDN编程) 。我也是一个刚刚学习python的新手,希望在疫情期间迎头赶上,欢迎大家一起讨论,共同进步。