初识爬虫三:xpath和BeautifulSoup

一、xpath

0、爬虫中网页的处理方式:

(1)数据获取和数据清理一体,HTML();

(2)数据获取和数据清洗分开,parse();

1、安装:需要下载导入lxml模块来支持xpath表达式;

2、区别:方便的处理html文档(先将html文档转换成xml文档,然后用xpath查找html节点或元素)

3、etree模块

form lxml import etree

html=etree.HTML(text)#etree模块下有个HTML方法,此方法将字符串解析成特殊的html对象,此时无法查看其中的内容,如果想看内容,需要转换;

result=etree.tostring(html,encoding="utf-8").decode()#tostring方法将此特殊的对象转换成字符串,字符串中中文会乱码,需要加上encoding="utf-8"转为字节码,最后用decode()方法将字节码解码;

#此方法还能将html结构中缺失的部分补齐;

4、解析本地html文档(parse()方法)

html=etree.parse("本地文件所在路径")

etree.tostring(html,encoding="utf-8").decode()#使用方法和HTML方法类似;

5、xpath使用

注意两点:1、//的含义是获取某个目录下的所有的子标签;

                  2、获取标签的内容需要加.text才能显示出内容,获取标签名和标签的属性可直接存储在列表中;

                  3、html文档中带有<的就是标签(标签都是成对出现的,如<table></talbe>、<form></form>。当然还有少部分不是成对出现的,如<br>、<hr>等。);标签中对应的内容表示属性(它总是以"属性名=属性值"这种名值对的形式出现);除属性外的则为标签的内容;

html示例:

<first>

<title>不谈游戏 Ryzen 7 1700对阵酷睿i7-6800K_AMD Ryzen 7 1700_CPUCPU评测-中关村在线</title>

<li name="reflash" content="ashhop">li>
<meta <li name="renderer" content="webkit">li>
<meta http-equiv="X-UA-Compatible"content="IE=Edge,chrome=1">
<meta name="keywords" content="Ryzen 7 1700,对阵,酷睿,i7-6800K" />
<meta name="description" content="  想必大家已经看惯了各种各样的游戏对比评测,目前AMDRyzen处理器的游戏性能毋庸置疑,很多人都已经测试过不止一次,多核心多线程配以高主频在游戏性能表现上显然不会输掉。在专业领域的表现到底如何我们还不得而。" />
<meta name="author" content="中关村在线" />
<meta name="Copyright" content="中关村在线版权所有" />
<link rel="stylesheet" href="https://icon.zol-img.com.cn/article/css/article.global.1.0.css"/>    
<script src="https://icon.zol-img.com.cn/article/js/jquery-1.8.3.min.js"></script>

</first>

(1)获取类标签(标签里的内容)

html=etree.parse("本地文件所在路径")

result=html.xpath("//title")#获取所有title标签下的内容,放到一个列表中;

print(result[0].text)#不加.text只能获取到对象地址;

>>>不谈游戏 Ryzen 7 1700对阵酷睿i7-6800K_AMD Ryzen 7 1700_CPUCPU评测-中关村在线

(2)获取指定属性的标签里的内容

html=etree.parse("本地文件所在路径")

result=html.xpath("//meta@name='author'")

print(result[0].text)

>>>content="中关村在线"

(3)获取标签的子标签下的内容

html=etree.parse("本地文件所在路径")

result=html.xpath("//meta/li[@name='renderer']")#获取meta标签下属性为name='renderer所对应li标签下的的值;

print(result[0].text)

>>>content="webkit"

(4)获取标签的属性信息

html=etree.parse("本地文件所在路径")

response=html.xpath("//meta/@name")#获取meta标签下属性为name所对应的值,属性值可以直接放在列表中,可以直接打印出来,有重复的也会单独分别显示出来;

print(response)

>>>["keywords","description","author","Copyright"]

(5)获取子标签(在不同层级下的子标签)

html=etree.parse("本地文件所在路径")

result=html.xpath("//first//li")#//li中的//表示在first标签下的所有层级下的li标签

print(result[0].text)

>>>name="reflash" content="ashhop"

(6)获取标签的内容和标签名

result=html.xpath("//meta[last()-1]/name")#获取倒数第二个meta标签下的name标签

.tag表示获取标签名

.text表示获取内容名

二、BeautifulSoup

1、BeautifulSoup的简介和安装

安装:pip install bs4

导入:from bs4 import BeautifulSoup

css选择器:BeautifulSoup

作用:和lxml一样,BeautifulSoup也是一个HTML/XML的解析器

主要功能也是提取和解析HTML/XML数据;

2、使用BeautifulSoup解析html

(1)解析字符串形式的html

线上文档:soup = BeautifulSoup(html,"lxml")

本地文档:soup = BeautifulSoup(open("C:\Users\Administrator\Desktop\image.html"))

(2)具体用法

print(soup)#将处理后的html文档打印出来(一是处理成可以解析的html文档,而是将html格简单的补全)

print(soup.prettify())#格式化输出soup对象,将格式变为有缩进的,可以看出目录结构;

print(soup.title)#title只取<>内的内容,此处表示获取title标签的信息(表示标签名+标签内容);

print(soup.title.string)#表示获取title标签的内容;

print(soup.title.name)#获取title标签的标签名,也就是title;

print(soup.p.attrs)#获取p标签内的所有属性;

print(soup.p.attrs["name"])#获取p标签内的所有属性name属性的值;

print(soup.head.content)#获取直接子标签,返回的结果是一个列表

print(soup.head.children)#获取直接子标签,返回的结果是一个生成器(里面装的是数据生成的方式),要取里面的内容需要用for循环来取;

print(soup.p.descendants)#获取p标签下的所有的子标签,返回的结果是一个生成器

三、搜索文档树(find_all()函数)

1、print(soup.find_all("a"))#根据字符串查找所有的a标签,返回一个结果集(bs4下特有的数据类型,与列表类似,里面的数据没有单引号或双引号),里面装的是标签对象,通过for循环打印;

2、print(soup.find_all(re.compile("^b"))#获取符合正则表达式b开头的标签,此处生成的标签为标签名+标签内容,标签内所有的信息都会打印出来;

3、print(soup.find_all(id="link2"))#根据link2属性查找标签;

4、print(soup.find_all(text = "a"))#根据属性下的内容来获取标签内容,一般也就是返回a,使用不多;

     print(soup.find_all(text = re.compile("do")))#找到属性的内容中含有do的标签下的内容;

四、css选择器(css选择器类型:标签选择器、类选择器、id选择器,使用方法select())

soup.select("a")#通过标签名获取所有的a标签,返回一个list列表;

soup.select(".sister")#通过类名获取所有的包含该类的标签;

soup.select(id="#link2")#通过id查找标签;

soup.select("p #link")#组合查找,查找p标签且标签下包含link属性的标签;

soup.select('a[herf="sas"]')#通过a标签下herf="sas"的属性进行查找;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木头人123。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值