# 1. ===================使用etree================ # 下载:pip3 install lxml # 导包:from lxml import etree # 将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点 # 2.1 本地文件:tree = etree.parse(文件名) tree.xpath("xpath表达式") # 2.2 网络数据:tree = etree.HTML(网页内容字符串) tree.xpath("xpath表达式") # 2. ===================使用Selector============= from scrapy import Selector html_selector = Selector(text=response) str = html_selector.xpath("/html/body/div[2]/div[1]/div[2]/div[1]/p[1]/a/b/text()").extract_first() print(str) # 落梅风·斜阳外 # 3. =================xpath语法================= 1. 属性定位: # 找到class属性值为song的div标签 // div[@class="song"] 2. 层级 & 索引定位: # 找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的# 3. 直系子标签a // div[@class ="tang"]/ul/li[2]/a 4. 逻辑运算: # 找到href属性值为空且class属性值为du的a标签 // a[@href="" and @class="du"] 5. 模糊匹配: # class中包含ng的 class="xxx" 是这个class类 // div[contains(@class, "ng")] # contains 包含 // div[starts-with(@class, "ta")] # starts 以什么什么开头 6. 取文本: # /表示获取某个标签下的文本内容 # //表示获取某个标签下的文本内容和所有子标签下的文本内容 // div[@class="song"]/p[1]/text() # 取直系文本 // div[@class="tang"]//text() # 取所有文本 # /text 返回列表 一个列表 # //text() 返回多个列表 7. 取属性: // div[@class="tang"]//li[2]/a/@href // a[text()='下一页']/@href #4. =================xpath函数====================== 1. starts-with函数 获取以xxx开头的元素 例子:xpath(‘//div[stars-with(@class, ”test”)]’) 2 contains函数 获取包含xxx的元素 例子:xpath(‘//div[contains(@id, ”test”)]’) 3 and 与的关系 例子:xpath(‘ // div[contains(@id, ”test”) and contains(@id, ”title”)]’) 4 text()函数 # /表示获取某个标签下的文本内容 # //表示获取某个标签下的文本内容和所有子标签下的文本内容 // div[@class="song"]/p[1]/text() # 取直系文本 // div[@class="tang"]//text() # 取所有文本 # /text 返回一个列表 # //text() 返回多个列表 # 4. ==================BeautifulSoup================== # 使用流程: - 导包:from bs4 import BeautifulSoup - 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容 (1)转化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml') (2)转化网络文件: - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml') (3)打印soup对象显示内容为html文件中的内容 # 基础巩固: (1)根据标签名查找 - soup.a # 只能找到第一个符合要求的标签 (2)获取属性 - soup.a.attrs # 获取a所有的属性和属性值,返回一个字典 - soup.a.attrs['href'] # 获取href属性 - soup.a['href'] # 也可简写为这种形式 (3)获取内容 - soup.a.string # 返回字符串 直系文本数据 直系就是没有跨级 比如ul下的li # li里面的a标签就不是直系了 - soup.a.text # 很可能返回列表 非直系的文本数据 - soup.a.get_text() # 很可能返回列表 非直系的文本数据 【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容 (4)find:找到第一个符合要求的标签 - soup.find('a') # 找到第一个符合要求的和soup.a 效果一样 返回的是单数 - soup.find('a', title="xxx") # 获得属性值为title="xxx"的标签 - soup.find('a', alt="xxx") - soup.find('a', class_="xxx") # 注意下划线 - soup.find('a', id="xxx") (5)find_all: # 找到所有符合要求的标签 返回的是复数 - soup.find_all('a') - soup.find_all(['a', 'b']) # 找到所有的a和b标签 - soup.find_all('a', limit=2) # 限制前两个 (6)根据选择器选择指定的内容 select:soup.select('#feng') - 常见的选择器 :标签选择器(a)、类选择器(.)、id选择器( # )、层级选择器 - 层级选择器: div.dudu # lala .meme .xixi # 下面好多级 div空格.dudu div > p > a >.lala # 只能是下面一级 【注意】select选择器返回永远是列表,需要通过下标提取指定的对象