一、概述
1. 响应内容分类
结构化 (json数据、xml数据 非结构化 (html
2. xml和html
xml是一种可扩展标记语言Extensible Markup Language,形似html,功能更专注于传输、存储数据,焦点是更好的显示数据 html 超文本标记语言HyperText Markup Language,更好的显示数据 -
3. 数据解析
二、jsonpath模块
多层嵌套的复杂字典,jsonpath可以直接提取
1. 提取数据的方法
from jsonpath import jsonpath
ret = jsonpath( a, 'jsonpath语法规则字符串' )
2. jsonpath语法规则
$
根节点 .
子节点 ..
内部任意位置
from jsonpath import jsonpath
data = { 'key1' : { 'key2' : { 'key3' : 'nihao' } } }
print ( data[ 'key1' ] [ 'key2' ] [ 'key3' ] )
print ( jsonpath( data, '$..key3' ) [ 0 ] )
3. jsonpath练习:获取拉钩网城市json文件中城市的名字
http: // www. lagou. com/ lbs/ getAllCitySearchLabels. json
import requests
import jsonpath
import json
headers = { 'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40'
}
response = requests. get( 'https://www.lagou.com/lbs/getAllCitySearchLabels.json' , headers= headers)
dict_data = json. loads( response. content)
print ( jsonpath. jsonpath( dict_data, '$..A..name' ) )
print ( jsonpath. jsonpath( dict_data, '$..name' ) )
三、lxml模块
1. lxml模块和xpath语法
Xpath(XML path language)在HTML\XML文档中特定元素以及获取节点信息(文本内容,属性值),对元素、属性,进行遍历
2. xpath helper插件
3. xpath 语法_如何找节点
\
隔开的是标签(节点)
nodename 选中该元素 html
/
绝对路径 /html/head/title
//
相对路径 /html//title
.
当前节点 ..
当前节点的上一节点 @
抽取节点后的一个属性 //title/@href
text()
开闭标签之间取文本内容 //link/text()
4.xpath语法_节点修饰语法
① 通过索引
路径表达式 结果 //title[@lang=''eng'']
选择lang属性值为eng的所有title元素 /bookstore/book[1]
选择属于bookstore子元素的第一个book元素 /bookstore/book[last()]
选择属于bookstore子元素的最后一个book元素 /bookstore/book[last()-1]
选择属于bookstore子元素的倒数第二个book元素 /bookstore/book[position()>1]
选择bookstore下面的book元素,从第二个开始
② 通过属性值
路径表达式 结果 //book/title[text()='Harry Potter']
选择bookstore下面的title元素,仅选择文本为hp的元素 //div[@id="content-left"]/div/@id
第一个@是使用标签名标签值修饰节点 第二个/@
是取属性值
③ 通过子节点的值修饰节点
路径表达式 结果 /bookstore/book[price>35.00]
选择bookstore下面的title元素,仅选择文本为hp的元素
④通过包含修饰
路径表达式 结果 //div[contains(@id,"qiushi_tag_")]
contains(属性名,属性值)
5. xpath语法_通配符
通配符 *
所有节点 @*
所有节点的属性 node()
匹配任何类型的节点
6.使用
from lxml import etree
html = etree. HTML( text)
List = html. xpath( "xpath语法规则字符串" )
爬取某个贴吧的评论
下一页尽量不使用索引
import requests
from lxml import etree
class Tieba ( object ) :
def __init__ ( self, name) :
self. url = "https://tieba.baidu.com/f?kw={}" . format ( name)
self. headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40"
}
def get_data ( self, url) :
response = requests. get( url, headers= self. headers)
with open ( "temp.html" , "wb" ) as f:
f. write( response. content)
return response. content
def parse_data ( self, data) :
data = data. decode( ) . replace( "<!--" , "" ) . replace( "-->" , "" )
html = etree. HTML( data)
el_list = html. xpath( '//*[@id="thread_list"]/li/div/div[2]/div[1]/div[1]/a' )
data_list = [ ]
for el in el_list:
temp = { }
temp[ 'title' ] = el. xpath( "./text()" ) [ 0 ]
temp[ 'link' ] = 'http://tieba.baidu.com' + el. xpath( "./@href" ) [ 0 ]
data_list. append( temp)
try :
next_url = 'https:' + html. xpath( '//a[contains(text(),"下一页>")]/@href' ) [ 0 ]
except :
next_url = None
print ( next_url)
return data_list, next_url
def save_data ( self, data_list) :
for data in data_list:
print ( data)
def run ( self) :
next_url = self. url
while True :
data = self. get_data( next_url)
data_list, next_url = self. parse_data( data)
self. save_data( data_list)
print ( next_url)
if next_url == None :
break
if __name__ == '__main__' :
tieba = Tieba( " " )
tieba. run( )
改了好久!嘿嘿coding 有趣!