目录

一、xpath解析原理

1、获取HTML内容

1)加载本地html文件  etree.parse(local_file_path, parser=parser)

2)加载网络请求返回的html内容  etree.HTML(response_text)

3)etree对象的方法 etree.tostring()

2、xpath表达式

1)路径表达式

2)带有谓语的路径表达式

3)选取未知节点

4)选取若干路径

3、常用xpath定位表达式用法

1>  所有节点名为node,且包含class属性的节点  //node[@class]

2>  所有节点名为node,且不包含class属性的节点  //node[not(@class)]

3>  所有节点名为node,且同时包含class属性和id属性的节点  //node[@class and @id]

4>  所有节点名为node,指定id属性值的节点  //node[@id="myid"]

5>  所有节点名为node,且文本中包含substring的节点  //node[contains(text(), substring)]

6>  所有节点名为node,指定文本内容text()的节点   //node[text()="mytext"]

7>  查找标签名称对应的所有节点  //*[name()="标签名称"]  等同于 //node

8>  包含多个孩子节点的节点  //*[count(p)=2]

9>  查找多个标签节点,查找结果取并集  //node1 | //node2

10> 其他

二、xpath(案例)

1、爬取58二手房中的房源信息 (总价,单价,房源名称)

2、解析下载4K图片数据

3、爬取全国城市名称


一、xpath解析原理

  • 实例化一个etree对象,且需要将被解析的页面源码数据加载到该对象中;
  • 调用etree对象中的xpath方法,结合xpath表达式,实现标签的定位,和内容的捕获;
  • 环境安装:pip install --user lxml

1、获取HTML内容

1)加载本地html文件  etree.parse(local_file_path, parser=parser)

# 加载本地html文件
from lxml import etreelocal_file_path = './test3.html'
parser = etree.HTMLParser(encoding="utf-8")
tree = etree.parse(local_file_path, parser=parser)  # 加载本地的html内容到etree对象
print(type(tree))  # <class 'lxml.etree._ElementTree'>
print(tree)  # <lxml.etree._ElementTree object at 0x0000019C52F16DC0>

输出结果:

<class 'lxml.etree._ElementTree'>
<lxml.etree._ElementTree object at 0x0000027F8ACB6D00>

2)加载网络请求返回的html内容  etree.HTML(response_text)

# 加载网络请求返回的html内容
from lxml import etree
import requestsget_url = 'http://www.baidu.com'
page_text = requests.get(get_url).text
print(type(page_text))  # <class 'str'>,响应内容是字符串
tree = etree.HTML(page_text)
print(type(tree))  # <class 'lxml.etree._Element'>
print(tree)  # <Element html at 0x22c6cc34a00>

输出结果:

<class 'str'>
<class 'lxml.etree._Element'>
<Element html at 0x10a01f24940>

3)etree对象的方法 etree.tostring()

from lxml import etreelocal_file_path = './test3.html'
parser = etree.HTMLParser(encoding="utf-8")
tree = etree.parse(local_file_path, parser=parser)  # 加载本地的html内容到etree对象result = etree.tostring(tree, pretty_print=True, encoding="utf-8")
print(result)

输出结果:

b'<!DOCTYPE html>\n<html>
\n<head>
\n<meta charset="utf-8"/>
\n<title>my html head title content</title>
\n</head>
\n<body>
\n    <h1>\xe6\x88\x91\xe7\x9a\x84\xe7\xac\xac\xe4\xb8\x80\xe4\xb8\xaa\xe6\xa0\x87\xe9\xa2\x98</h1>
\n    <p>\xe6\x88\x91\xe7\x9a\x84\xe7\xac\xac\xe4\xb8\x80\xe4\xb8\xaa\xe6\xae\xb5\xe8\x90\xbd</p>
\n    <a href="default.htm">\xe6\x88\x91\xe7\x9a\x84\xe8\xb6\x85\xe9\x93\xbe\xe6\x8e\xa5\xe6\x96\x87\xe5\xad\x97</a>
\n    <div id="div1">
\n        <p id="p1">text1</p>
\n        <p id="p2">text2</p>
\n        <p id="p3">text3</p>
\n    </div>
\n    <div class="div2">
\n        <div id="div2-div01">
\n        </div>
\n    </div>
\n    <h2>
\n        <div id="div3">
\n            <div id="div3-div01"/>
\n        </div>
\n    </h2>
\n</body>
\n</html>\n'

2、xpath表达式

<?xml version="1.0" encoding="UTF-8"?><bookstore><book><title lang="eng">Harry Potter</title><price>29.99</price>
</book><book><title lang="eng">Learning XML</title><price>39.95</price>
</book></bookstore>

1)路径表达式

表达式 路径表达式 描述
nodename bookstore 选取此节点的所有子节点。选取 bookstore 元素的所有子节点。
/

/bookstore

bookstore/book

从根节点选取。选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

选取属于 bookstore 的子元素的所有 book 元素。

//

//book

bookstore//book

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

选取所有 book 子元素,而不管它们在文档中的位置。

选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。

.   选取当前节点。
..   选取当前节点的父节点。
@

//@lang

//div[@class="my"]/img/@src

选取属性。

选取名为 lang 的所有属性

取img标签src属性的值

取文本

/text()

li//text()

取标签的直系文本内容

取li标签的子标签的文本内容

2)带有谓语的路径表达式

  • 谓语用来查找某个特定的节点或者包含某个指定的值的节点。
  • 谓语被嵌在方括号中。
路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

3)选取未知节点

  • XPath 通配符可用来选取未知的 XML 元素。
通配符 路径表达式 描述
*

/bookstore/*

//*

匹配任何元素节点。

选取 bookstore 元素的所有子元素。

选取文档中的所有元素。

@* //title[@*]

匹配任何属性节点。

选取所有带有属性的 title 元素。

node()   匹配任何类型的节点。

4)选取若干路径

  • 在路径表达式中使用"|"运算符,您可以选取若干个路径
路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

3、常用xpath定位表达式用法

前置代码

from lxml import etreelocal_file_path = './test4.html'
parser = etree.HTMLParser(encoding="utf-8")
tree = etree.parse(local_file_path, parser=parser)  # 加载本地的html内容到etree对象

1>  所有节点名为node,且包含class属性的节点  //node[@class]

包含href属性的a节点对应的文本内容  //a[@href]
# <a href="default.htm">我的超链接文字</a>

# 包含href属性的a节点对应的文本内容
# <a href="default.htm">我的超链接文字</a>
result = tree.xpath('//a[@href]/text()')
print(result)  # 返回列表,只包含一个元素
print(result[0])  # 返回列表中第一个元素

输出结果:

['我的超链接文字']
我的超链接文字

2>  所有节点名为node,且不包含class属性的节点  //node[not(@class)]

不包含class属性的div节点的文本内容  //div[not(@class)]
# <div id = "div3">第三个div</div>

# 不包含class属性的div节点的文本内容
# <div id = "div3">第三个div</div>
result = tree.xpath('//div[not(@class)]/text()')
print(result)  # 返回列表,只包含一个元素

输出结果:

['第三个div']

3>  所有节点名为node,且同时包含class属性和id属性的节点  //node[@class and @id]

同时包含class属性和id属性的div节点的文本内容  //div[@class and @id]

# <div class = "div4" id = "div5">第四个div</div>

# 同时包含class属性和id属性的div节点的文本内容
# <div class = "div4" id = "div5">第四个div</div>
result = tree.xpath('//div[@class and @id]/text()')
print(result)  # 返回列表,只包含一个元素

输出结果:

['第四个div']

4>  所有节点名为node,指定id属性值的节点  //node[@id="myid"]

id为div3的div节点  //div[@id="div3"]

# <div id = "div3">第三个div</div>

# id为div3的div节点
# <div id = "div3">第三个div</div>
result = tree.xpath('//div[@id="div3"]/text()')
print(result)  # 返回列表,只包含一个元素

输出结果:

['第三个div']

5>  所有节点名为node,且文本中包含substring的节点  //node[contains(text(), substring)]

文本内容中包含“第二个”字符串的div节点  //div[contains(text(), "第二个")]
# <div class = "div2">第二个div</div>

# 文本内容中包含“第二个”字符串的div节点
# <div class = "div2">第二个div</div>
result = tree.xpath('//div[contains(text(), "第二个")]/text()')
print(result)  # 返回列表,只包含一个元素

输出结果:

['第二个div']

超链接的文本内容中包含“下一页”字符串的节点  //a[contains(text(), "下一页")]
# <a href="nextpage.html">我的下一页</a>

# 超链接的文本内容中包含“下一页”字符串的节点
# <a href="nextpage.html">我的下一页</a>
result = tree.xpath('//a[contains(text(), "下一页")]/text()')
print(result)  # 返回列表,只包含一个元素

输出结果:

['我的下一页']

超链接的href属性中包含“default”字符串的节点  //a[contains(@href, "default")]
# <a href="default.html">我的超链接文字</a>

# 超链接的href属性中包含“default”字符串的节点
# <a href="default.html">我的超链接文字</a>
result = tree.xpath('//a[contains(@href, "default")]/text()')
print(result)  # 返回列表,只包含一个元素

输出结果:

['我的超链接文字']

6>  所有节点名为node,指定文本内容text()的节点   //node[text()="mytext"]

超链接的文本内容是“我的下一页”的节点  //a[text()="我的下一页"]
# <a href="nextpage.html">我的下一页</a>

# 超链接的文本内容是“我的下一页”的节点
# <a href="nextpage.html">我的下一页</a>
result = tree.xpath('//a[text()="我的下一页"]/text()')
print(result)  # 返回列表,只包含一个元素

输出结果:

['我的下一页']

7>  查找标签名称对应的所有节点  //*[name()="标签名称"]  等同于 //node

所有标签名称为a的标签的节点  //*[name()="a"]
# <a href="default.html">我的超链接文字</a>
# <a href="nextpage.html">我的下一页</a>

# 所有a标签的节点
# <a href="default.html">我的超链接文字</a>
# <a href="nextpage.html">我的下一页</a>
result = tree.xpath('//*[name()="a"]/text()')
print(result)  # 返回列表,包含2个元素

输出结果:

['我的超链接文字', '我的下一页']

所有标签名称以s开始的标签的节点  //*[starts-with(name(),"s")]
# <small>更小的文本</small>
# <strong>重要的文本</strong>

# 所有以s开始的标签的节点
# <small>更小的文本</small>
# <strong>重要的文本</strong>
result = tree.xpath('//*[starts-with(name(),"s")]/text()')
print(result)  # 返回列表,包含2个元素

输出结果:

['更小的文本', '重要的文本']

所有标签名称包含sm的标签的节点  //*[contains(name(),"sm")]
# <small>更小的文本</small>

# 所有包含sm的标签的节点
# <small>更小的文本</small>
result = tree.xpath('//*[contains(name(),"sm")]/text()')
print(result)  # 返回列表,包含1个元素

输出结果:

['更小的文本']

所有标签名字的长度为6个字母的节点  //*[string-length(name()) = 6]
# <strong>重要的文本</strong>

# 所有标签名字的长度为6个字母的节点
# <strong>重要的文本</strong>
result = tree.xpath('//*[string-length(name()) = 6]/text()')
print(result)  # 返回列表,包含1个元素

输出结果:

['重要的文本']

8>  包含多个孩子节点的节点  //*[count(p)=2]

所有包含2个p标签孩子节点的节点  //*[count(p)=2]
# <div>包含2个p节点<p>p1</p><p>p2</p></div>

# 所有包含2个p标签孩子节点的节点
# <div>包含2个p节点<p>p1</p><p>p2</p></div>
result = tree.xpath('//*[count(p)=2]/text()')
print(result)  # 返回列表,包含1个元素

输出结果:

['包含2个p节点']

所有包含2个孩子节点的节点  //*[count(*)=2]

# 所有包含2个孩子节点的节点
result = tree.xpath('//*[count(*)=2]/text()')
print(result)  # 返回列表

9>  查找多个标签节点,查找结果取并集  //node1 | //node2

查找多个标签节点  //h3/text() | //h4/text()
# <h3>我的3级标题</h3>
# <h4>我的4级标题</h4>

# 查找多个标签节点
# <h3>我的3级标题</h3>
# <h4>我的4级标题</h4>
result = tree.xpath('//h3/text() | //h4/text()')
print(result)  # 返回列表

输出结果:

['我的3级标题', '我的4级标题']

10> 其他

10-1>  //CCC/descendant::* 所有以CCC为其祖先的节点

10-2>  //DDD/parent::* DDD节点的所有父节点

10-3>  //BBB[position() mod 2 = 0] 偶数位置的BBB节点

10-4>  P/text()[2] 当前上下文节点中的P节点的第二个文本节点

10-5>  ancestor::BOOK[1] 离当前上下文节点最近的book祖先节点

二、xpath(案例)

1、爬取58二手房中的房源信息 (总价,单价,房源名称)

爬取地址:https://sh.58.com/ershoufang/

注意:先定位到多个li标签后,再循环遍历li标签,再从li标签当前位置定位li标签下面的标签;

# 爬取58二手房中的房源信息
from lxml import etree
import requestsget_url = 'https://sh.58.com/ershoufang/'
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/86.0.4240.111 Safari/537.36"
}
param = {"utm_source": "market","spm": "u-2d2yxv86y3v43nkddh1.BDPCPZ_BT","PGTID": "0d100000-0000-2127-b527-60f51c028390","ClickID": "2"
}page_text = requests.get(get_url, params=param, headers=header).text
tree = etree.HTML(page_text)  # 加载网页HTML数据# 先定位到多个li标签
li_list = tree.xpath('//ul[@class = "house-list-wrap"]/li')# 循环遍历li标签
for li in li_list:# 从li标签当前位置,定位孩子节点的直接文本,获取房源名称,房源总价,房源单价house_name = li.xpath('./div[@class="list-info"]/h2/a/text()')[0]house_price_sum = li.xpath('./div[@class="price"]/p[@class="sum"]/b/text()')[0]house_price_unit = li.xpath('./div[@class="price"]/p[@class="unit"]/text()')[0]print(f'房子总价:{house_price_sum}万,房子单价:{house_price_unit},房源名称:{house_name} ')

输出结果:

房子总价:200万,房子单价:23530元/㎡,房源名称:豪华装修 房东急置换 诚意卖房 重阳特价 来电价  
房子总价:198万,房子单价:23363元/㎡,房源名称:天居玲珑湾 两房两厅 自住装修保养好 看房方便  
房子总价:285万,房子单价:28367元/㎡,房源名称:动迁标杆小区 精装修 美罗家园润苑 采光好 周边  
房子总价:870万,房子单价:110463元/㎡,房源名称:采光好看房有钥匙 南北通透 房东急置换

2、解析下载4K图片数据

爬取地址:http://pic.netbian.com/4kfengjing/

问题:etree.HTML(response_text)没有指定编码,导致报错,或者解析中文乱码;

原因:lxml.etree.HTML处理网页源代码,如果没有指定编码,会使用一个默认编码,从而导致和response_text的编码冲突,导致无法解析报错,或者解析出来的中文乱码。

解决方法:手动指定编码(传入参数parser),etree.HTML(response_text, parser)

# 手动指定编码格式,解决格式不规范或者中文乱码问题
parser = etree.HTMLParser(encoding='gbk')  # 解析时传入手动指定的parser编码格式
tree = etree.HTML(page_text, parser=parser)

问题:解析出来的图片名称,中文乱码;

解决方法:先用标准编码格式编码,再用目标格式解码;pic_name = pic_name.encode('iso-8859-1').decode('gbk')

# 解析下载4K图片数据
import requests
from lxml import etree
import os
import os.pathget_url = 'http://pic.netbian.com/4kfengjing/'
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/86.0.4240.111 Safari/537.36"
}
pre_url = 'http://pic.netbian.com'response = requests.get(url=get_url, headers=header)
# 设置响应数据的编码格式,中文就不会显示乱码
# response.encoding = 'gbk'
page_text = response.text# 手动指定编码格式,解决格式不规范或者中文乱码问题
parser = etree.HTMLParser(encoding='gbk')  # 解析时传入手动指定的parser编码格式
tree = etree.HTML(page_text, parser=parser)# 获取到多个li标签,返回列表
li_list = tree.xpath('//div[@class="slist"]//li')if not os.path.exists('pictures'):os.mkdir('pictures')# 遍历li标签,在li标签当前位置定位孩子节点
for li in li_list:# 解析获取图片详情页面pic_detail_url = pre_url + li.xpath('./a/@href')[0]response_detail = requests.get(pic_detail_url, header)# response_detail.encoding = 'gbk'detail_page_text = response_detail.text# 在图片详情页面中,解析获取图片的url和titledetail_tree = etree.HTML(detail_page_text, parser=parser)pic_src = pre_url + detail_tree.xpath('//div[@class="photo-pic"]/a/img/@src')[0]pic_name = detail_tree.xpath('//div[@class="photo-pic"]/a/img/@title')[0]# 通用处理中文乱码的解决方案pic_name = pic_name.encode('iso-8859-1').decode('gbk')print(f'图片名称是:{pic_name}')# 下载保存图片pic_content = requests.get(pic_src, headers=header).contentwith open('./pictures/' + pic_name + '.jpg', 'wb') as fp:fp.write(pic_content)print(f'{pic_name}.jpg,下载完成')
print('爬虫结束')

输出结果:

图片名称是:阿尔卑斯山风景4k高清壁纸3840x2160
图片名称是:Surface Laptop Go Ice Blue 微软4k风景壁纸

3、爬取全国城市名称

爬取地址:https://www.aqistudy.cn/historydata/

按照热门城市,全部城市分别展示城市名称

# 爬取全国城市名称
import requests
from lxml import etreeget_url = 'https://www.aqistudy.cn/historydata/'
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/86.0.4240.111 Safari/537.36"
}
response = requests.get(get_url, headers=header)
response.encoding = 'utf-8'
page_text = response.text
tree = etree.HTML(page_text)  # 加载请求页面数据print("热门城市:")
li_list_hot = tree.xpath('//div[@class="hot"]/div[2]//li')
for li in li_list_hot:city_name = li.xpath('./a/text()')[0]  # 获取热门城市名称print(city_name, end=' ')print('\n')
print("全部城市:", end='')
ul_list = tree.xpath('//div[@class="all"]/div[2]/ul')
for ul in ul_list:first_letter = ul.xpath('./div[1]/b/text()')[0]  # 获取城市拼音首字母print('\n', first_letter)li_list = ul.xpath('./div[2]/li')for li in li_list:city_name = li.xpath('./a/text()')[0] # 获取全部城市名称print(city_name, end=' ')

输出结果:

获取全国城市列表(热门城市+全国城市取并集后展示,未去重复)f'{xpath_ex_hot} | {xpath_ex_all}'

# 爬取全国城市名称(未去重复)
import requests
from lxml import etreeget_url = 'https://www.aqistudy.cn/historydata/'
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/86.0.4240.111 Safari/537.36"
}
response = requests.get(get_url, headers=header)
response.encoding = 'utf-8'
page_text = response.text
tree = etree.HTML(page_text)  # 加载请求页面数据# 解析热门城市和全国城市
xpath_ex_hot = '//div[@class="hot"]/div[2]//li'  # 热门城市所在li标签
xpath_ex_all = '//div[@class="all"]/div[2]/ul/div[2]/li'  # 全国城市所在li标签
xpath_ex = f'{xpath_ex_hot} | {xpath_ex_all}'  # 取li标签并集li_list = tree.xpath(xpath_ex)  # 传入并集的xpath表达式,获取li标签列表
print('全国城市名称:')# 遍历li标签,打印热门城市和全部城市的名称(并集,未去重)
for li in li_list:city_name = li.xpath('./a/text()')[0]  # 获取所有li标签对应的超链接文本print(city_name, end=' ') 

输出结果: 

全国城市名称:
北京 上海 广州 深圳 杭州 天津 成都 南京 西安 武汉 阿坝州 安康 阿克苏地区 阿里地区 阿拉善盟 阿勒泰地区 安庆 安顺 鞍山 克孜勒苏州 安阳 蚌埠 白城 保定 北海 宝鸡 北京 毕节 博州 白山 百色 保山 白沙 包头 保亭 本溪 巴彦淖尔 白银 巴中 滨州 亳州 长春 昌都 常德 成都 承德 赤峰 昌吉州 五家渠 昌江 澄迈 重庆 长沙 常熟 楚雄州 朝阳 沧州 长治 常州 潮州 郴州 池州 崇左 滁州 定安 丹东 东方 东莞 德宏州 大理州 大连 大庆 大同 定西 大兴安岭地区 德阳 东营 黔南州 达州 德州 儋州 鄂尔多斯 恩施州 鄂州 防城港 佛山 抚顺 阜新 阜阳 富阳 抚州 福州 广安 贵港 桂林 果洛州 甘南州 固原 广元 贵阳 甘孜州 赣州 广州 淮安 海北州 鹤壁 淮北 河池 海东地区 邯郸 哈尔滨 合肥 鹤岗 黄冈 黑河 红河州 怀化 呼和浩特 海口 呼伦贝尔 葫芦岛 哈密地区 海门 海南州 淮南 黄南州 衡水 黄山 黄石 和田地区 海西州 河源 衡阳 汉中 杭州 菏泽 贺州 湖州 惠州 吉安 金昌 晋城 景德镇 金华 西双版纳州 九江 吉林 即墨 江门 荆门 佳木斯 济南 济宁 胶南 酒泉 句容 湘西州 金坛 鸡西 嘉兴 江阴 揭阳 济源 嘉峪关 胶州 焦作 锦州 晋中 荆州 库尔勒 开封 黔东南州 克拉玛依 昆明 喀什地区 昆山 临安 六安 来宾 聊城 临沧 娄底 乐东 廊坊 临汾 临高 漯河 丽江 吕梁 陇南 六盘水 拉萨 乐山 丽水 凉山州 陵水 莱芜 莱西 临夏州 溧阳 辽阳 辽源 临沂 龙岩 洛阳 连云港 莱州 兰州 林芝 柳州 泸州 马鞍山 牡丹江 茂名 眉山 绵阳 梅州 宁波 南昌 南充 宁德 内江 南京 怒江州 南宁 南平 那曲地区 南通 南阳 平度 平顶山 普洱 盘锦 蓬莱 平凉 莆田 萍乡 濮阳 攀枝花 青岛 琼海 秦皇岛 曲靖 齐齐哈尔 七台河 黔西南州 清远 庆阳 钦州 衢州 泉州 琼中 荣成 日喀则 乳山 日照 韶关 寿光 上海 绥化 石河子 石家庄 商洛 三明 三门峡 山南 遂宁 四平 商丘 宿迁 上饶 汕头 汕尾 绍兴 三亚 邵阳 沈阳 十堰 松原 双鸭山 深圳 朔州 宿州 随州 苏州 石嘴山 泰安 塔城地区 太仓 铜川 屯昌 通化 天津 铁岭 通辽 铜陵 吐鲁番地区 铜仁地区 唐山 天水 太原 台州 泰州 文昌 文登 潍坊 瓦房店 威海 乌海 芜湖 武汉 吴江 乌兰察布 乌鲁木齐 渭南 万宁 文山州 武威 无锡 温州 吴忠 梧州 五指山 西安 兴安盟 许昌 宣城 襄阳 孝感 迪庆州 锡林郭勒盟 厦门 西宁 咸宁 湘潭 邢台 新乡 咸阳 新余 信阳 忻州 徐州 雅安 延安 延边州 宜宾 盐城 宜昌 宜春 银川 运城 伊春 云浮 阳江 营口 榆林 玉林 伊犁哈萨克州 阳泉 玉树州 烟台 鹰潭 义乌 宜兴 玉溪 益阳 岳阳 扬州 永州 淄博 自贡 珠海 湛江 镇江 诸暨 张家港 张家界 张家口 周口 驻马店 章丘 肇庆 中山 舟山 昭通 中卫 张掖 招远 资阳 遵义 枣庄 漳州 郑州 株洲

爬虫开发02--数据解析--xpath(首选)相关推荐

  1. 爬虫 第三讲 数据解析

    文章目录 爬虫 第三讲 数据解析 一.正则表达式 1.match()函数.search()函数.findall()函数 2.正则表达式中的元字符 3.正则表达式模式 4.正则表达式重复匹配 5.正则表 ...

  2. python爬虫解析数据包_Python网络爬虫之三种数据解析方式

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  3. python爬虫程序详解_Python网络爬虫之三种数据解析方式

    指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为大多数情况下的需求,我们都会指 ...

  4. Python爬虫学习之数据提取(XPath)

    Python爬虫学习之数据提取XPath 概述 常用规则 运算符及介绍 准备工作 实例 文本获取 属性获取 属性值匹配 属性多值匹配 多属性匹配 按序选择 概述 XPath的全称是XML Path L ...

  5. java爬取网页数据_Python网络爬虫实战(二)数据解析

    Python网络爬虫实战 (二)数据解析 本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站 ...

  6. 爬虫之常用数据解析方法

    爬虫之常用数据解析方法

  7. 爬虫之网络数据解析的三种方式---正则表达式、XPath数据解析库、BeautifulSoup数据解析库

    1.正则表达式 爬虫的四个主要步骤: 明确目标(要知道你准备取哪个范围或者网站上取搜索) 爬(将所有网站的内容全部爬下来) 取(取掉对我们没用的数据) 处理数据(按照我们想要的方式存储和使用) 什么是 ...

  8. python爬虫数据解析xpath解析详细讲解——附有详细案例

    案例③由于时间流逝,网页爬取失效了 最近考研复试,增加一个案例,爬取985211学校,并以excel表格形式存储 文章目录 1.什么是xpath 是最常用的最广泛的数据解析方式 2.xpath解析原理 ...

  9. 吃西瓜--爬虫系列之数据解析

    XPath语法 xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. 开发工具 Chrome插件XPath ...

最新文章

  1. 利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件
  2. SQL语句正常,在Navicat中运行正常,但是在后台运行,无法查询出数据,也不报错...
  3. Web框架 — Flask
  4. python seed()
  5. hessian学习笔记
  6. mysql update 批量更新_mysql 批量更新的两种方法
  7. secucrecrt配置文件导入和保存
  8. Win9x 与 WinME 磁盘共享密码破解实战
  9. Tomcat免安装版+Eclipse配置
  10. 将输入的字符串逆序输出
  11. python使用win32com复制word的某一页然后粘贴到新的word页面中
  12. Wireshark配置安装以及抓包教程详解(win10版)(包含TCP IP ICMP 三次握手 半扫描等相关知识 )
  13. 作图,用ECharts就够了
  14. 服务器内存2rx4是什么意思_云主机服务器内存(服务器内存1rx4和2rx4)
  15. Win10文件夹中图片不显示预览图解决方法
  16. node联合echarts简单实现疫情地图
  17. 详解Android电量优化
  18. 全国大学生数学建模竞赛获奖难度
  19. 使用Windows自带“录音机”录制音乐(转)
  20. TensorFlow入门教程(1)安装、基础、Tensorboard

热门文章

  1. 怎么吃才能促进孩子长个子?
  2. oracle 视图怎样修改,ORACLE视图的修改
  3. SPSS Modeler建立ODBC数据源使用数据库文件
  4. 网络抓包-抓包工具tcpdump的使用与数据分析
  5. #Reading Paper# 【序列推荐】ICKM 2022 RETR:Recommender Transformers with Behavior Pathways
  6. 【VS】InstallerProjects.vsix下载 Microsoft Visual Studio Installer Projects
  7. VSCode的配置和插件同步到多台电脑
  8. 智能音箱背后的自然语言理解和知识图谱技术
  9. json格式在C语言中的应用
  10. 外挂太多怎么解?云上找出路