Python爬虫自学之第(②)篇——BeautifulSoup解析网页

题外话:

《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人,信不信未来的PI,了解一下,唯一一个高度与之持平的项目

 

学了requests,了解了伪装技巧后,终于能爬到些比较正常的网页源码(html文档)了,但这离结果还差最后和是最重要的一步——筛选。这个过程就像在泥沙中淘金一样,没有合适的筛子,你就会把有价值的漏掉了,或者做了无用功把没用的也筛了出来。
淘金者看土质,做筛子。对应到爬虫领域就是观察html,定制筛选器

稍稍了解HTML

信息都在网页源码里,浏览器通过解析源码来加载我们所看到的东西,那我们是不是也应该学下如何看源码呢?——是的

但不要方,这不是html语法课,做爬虫的,只需了解一下html的原理和标签关系就行了,这跟认亲戚一样简单,你会看家族树的话根本不成问题。

示例html,足以解释所有节点关系。

  • <head><title>这些有尖括号的叫做标签(或节点),成对存在。<head><title>是标签名,标签间可以放字符串。
  • 标签可以拥有属性,属性在尖括号里,如title标签有名为lang的属性,属性值为"en"。
  • A节点被B节点包起来,A就是B的子,或B是A的父。如book和title都是是bookstore的子,但是book是bookstore的直接子(只有一层包含关系)
  • 有同一个直接父的标签互相为兄弟,如title,author,year,price互为兄弟。
<title><author></author><year></year><price></price>
</title>

好了,准备以下代码信息,用来练习获取内容:

from bs4 import BeautifulSoup

from bs4 import BeautifulSoup
#准备代码信息,用来练习获取内容
html ='''
<html>
<head><title>The Dormouse's story</title></head>  
<body>  
<h1><b>123456</b></h1>
<p class="title" name="dromouse"><b>The Dormouse's story</b>aaaaa
</p> 
<p class="title" name="dromouse" title='new'><b>The Dormouse's story</b>a</p>   
<p class="story">Once upon a time there were three little sisters; and their names were  <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,  <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and  <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;<a href="http://example.com/tillie" class="siterr" id="link4">Tillie</a>;  <a href="http://example.com/tillie" class="siterr" id="link5">Tillie</a>;  and they lived at the bottom of a well.
</p>  
<p class="story">...</p>
<ul id="ulone"><li>01</li><li>02</li><li>03</li><li>04</li><li>05</li>
</ul>
<div class='div11'><ul id="ultwo"><li>0001</li><li>0002</li><li>0003</li><li>0004</li><li>0005</li></ul>
</div>
</body> 
</html>

1.得到beautifulsoup对象

soup = BeautifulSoup(html,'html.parser')  #选择解析器

 

2.获取内容

(1)获取标题对象

print(soup.title)

 

获取标题文本字符串:

print(soup.title.string)  #返回迭代器,出现换行就找不到了
print(soup.title.text)
print(soup.title.get_text())
title = soup.find('title').get_text()
print(title)

 

通过上下级关系获取对象

print(soup.title.parent)
print(soup.title.child)     
print(soup.title.children)

 

(2)获取第一个p标签

print(soup.p.get_text())
print(soup.find('p').text)
#获取p的子标签们   (空行也看成了一个children)
print(soup.p.children)
for i,echo in enumerate(soup.p.children):print(i,echo)

 

(3)获取标签的属性

#只能找到第一个a标签
print('1',soup.a)
print('2',soup.a.name)
#应该这样写
print(soup.a.attrs)
print(soup.a.attrs['href'])
print(soup.a.attrs['id'])
print(soup.a.attrs['class'][0]) #获得的是一个列表,可以用下标查询

 

(4)获取多个

print(soup.find('p')) #获取一个
print(soup.find_all('p'))  #获取soup内的p标签  返回一个列表

 

(5)多层查询
find_all查询返回的是列表,使用下标寻找想要的内容

print(soup.find_all('ul'))
print(soup.find_all('ul')[0].find_all('li'))

 

(6)通过指定的属性,获取对象

print(soup.find(id='ulone'))  #单个对象
print(soup.find('ul',id='ulone'))
print(soup.find_all('ul',id='ulone'))   #可以使用下标查询

 

class是关键字 要这么写class_

print('class1',soup.find_all('p',class_='title'))
print('class2',soup.find_all('p',attrs={'class':'title'})) #更通用
print('class3',soup.find_all('p',attrs={'class':'title','title':'new'})) #多条件

 

用函数作为参数,获取元素

def judgeTilte1(t):if t=='title':return True
print(soup.find_all(class_=judgeTilte1))

 

判断长度

import re  #正则表达式
reg = re.compile("sis")
def judgeTilte2(t):#返回长度为6,且包含'sis'的t参数return len(str(t))==6 and bool(re.search(reg,t))
print(soup.find_all(class_=judgeTilte2))

 

#获取文本内容

# <p class="title" name="dromouse">
#     <b>The Dormouse's story</b>
#     aaaaa
# </p>
print(soup.find('p').text)
print(soup.find('p').string)  #返回迭代器,出现换行就找不到了<b>,
print(soup.find('p').get_text())

 

获取可以加limit的,限制访问个数

print(soup.find_all('a',limit=2))

 

recursive = True 寻找子孙 ;recursive = False只找子

print(soup.find_all('body')[0].find_all('ul',recursive = False))

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 说下你对css样式的这几个属性值initial、inherit、unset、revert的理解

[css] 说下你对css样式的这几个属性值initial、inherit、unset、revert的理解 initial&#xff08;初始&#xff09;、inherit&#xff08;继承&#xff09;、unset&#xff08;未设置&#xff09;、revert&#xff08;还原&#xff09; inherit可以继承父级元素的属性&#x…

Django通过中间件实现登录验证demo

前提&#xff1a;中间件版的登录验证需要依靠session&#xff0c;所以数据库中要有django_session表。 1 from django.conf.urls import url2 from django.contrib import admin3 from app01 import views4 5 urlpatterns [6 url(r^admin/, admin.site.urls),7 url(r^…

Python爬虫自学之第(③)篇——实战:requests+BeautifulSoup实现静态爬取

题外话&#xff1a; 《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人&#xff0c;信不信未来的PI&#xff0c;了解一下&#xff0c;唯一一个高度与之持平的项目 前篇全片都是生硬的理论使用&#xff0c;今天就放个静态爬取的实例让大家体验一下B…

[css] 如何解决css加载字体跨域的问题?

[css] 如何解决css加载字体跨域的问题&#xff1f; 刚才碰到一个css加载字体跨域问题&#xff0c;记录一下。 站点的动态请求与静态文件请求是不同的域名的。站点的域名为 www.domain.com&#xff0c;而静态文件的域名为 st.domain.com。 问题&#xff1a; 页面中加载css文件&…

django cookie、session

1.cookie (1)什么是cookie? 服务器让浏览器保存在浏览器本地的键值对 (2) 为什么要有cookie&#xff1f; 因为http协议无状态&#xff0c;每一次访问请求没有任何关系&#xff0c;无法保存状态 (3)cookie的特点&#xff1f; cookie是由服务器给浏览器设置的 在同一个浏览器中访…

Python爬虫自学之第(④)篇——强大的正则表达式,re模块

题外话&#xff1a; 《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人&#xff0c;信不信未来的PI&#xff0c;了解一下&#xff0c;唯一一个高度与之持平的项目 如果把BeautifulSopu比喻成通过线索一步步接近目标的侦探的话&#xff0c;那么正则…

[css] 当使用@font-face的时候,为什么src中要加入local呢?

[css] 当使用font-face的时候&#xff0c;为什么src中要加入local呢&#xff1f; 网上的说法片面不一&#xff0c;CSDN和掘金都没见到正确回复&#xff0c;然后我在MDN找到了比较明确的说法。MDN的 font-face 这是一个CSS 规则 &#xff0c;它允许网页开发者为其网页指定在…

Python爬虫自学之第(⑤)篇——爬取某宝商品信息

题外话&#xff1a; 《Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元》相信过去BTC的人&#xff0c;信不信未来的PI&#xff0c;了解一下&#xff0c;唯一一个高度与之持平的项目 能看到这里说明快进入动态网页爬取了&#xff0c;在这之前还有一两个知识点要了解&…

Vue通信、传值的多种方式,详解

Vue通信、传值的多种方式&#xff0c;详解 转自&#xff1a;https://blog.csdn.net/qq_35430000/article/details/79291287 一、通过路由带参数进行传值 ①两个组件 A和B,A组件通过query把orderId传递给B组件&#xff08;触发事件可以是点击事件、钩子函数等&#xff09; this.…

[css] 你有使用过font-size-adjust属性吗?说说它的作用是什么?

[css] 你有使用过font-size-adjust属性吗&#xff1f;说说它的作用是什么&#xff1f; 很少用。 实际应用场景&#xff1a; 实际应用场景在指定字体时&#xff0c;出于安全考虑&#xff0c;人们通常会为一个元素指定多种字体&#xff0c;希望当首选字体不可用时&#xff0c;让…

Python代写CSSE1001/7030 python程序作业、代做python CSSE1001/7030程序作业、 代写CSSE1001/7030 python 作业...

Python代写CSSE1001/7030 python程序作业、代做python CSSE1001/7030程序作业、 代写CSSE1001/7030 python 作业UnoAssignment 2CSSE1001/7030Semester 2, 2018Version 1.0.110 marksDue Friday 21st September, 2018, 20:30IntroductionThis assignment follows a programming…

selenium等待定位标签加载完再执行

遇到的问题描述 我们经常会碰到用selenium操作页面上某个元素的时候&#xff0c; 需要等待页面加载完成后&#xff0c; 才能操作。 否则页面上的元素不存在&#xff0c;会抛出异常。 比如&#xff1a; 一个动态网页使用了ajax的异步加载&#xff0c;我们需要等待元素加载…

[css] body{height:100%}和html,body{height:100%}有什么区别?为什么html要设置height:100%呢,html不就是整个窗口吗?

[css] body{height:100%}和html,body{height:100%}有什么区别&#xff1f;为什么html要设置height:100%呢&#xff0c;html不就是整个窗口吗&#xff1f; html是body的父级&#xff0c;在缺少了父级的宽高之后&#xff0c;如果给body设置一个渐变色背景的话将不会正常显示。个…

数据类型的操作

时间数据类型 1.mongo中存储时间大多为ISOData 2.获取当前时间   1. 使用new Date() 自动生成当前时间   2. 使用 ISODate() 生成当前时间   3. 获取计算机时间生成时间格式字符串 Date() 3.ISODate()   功能&#xff1a; 生成mongodb时间存储类型   参数&#xff1a…

python+selenium 浏览器无界面模式运行

以Chrome浏览器为例&#xff1a; 方法一&#xff1a; from selenium.webdriver import Chrome, ChromeOptionsopt ChromeOptions() # 创建Chrome参数对象 opt.headless True # 把Chrome设置成可视化无界面模式&#xff0c;windows/Linux 皆可 driv…

[css] 你所理解的css高级技巧有哪些?

[css] 你所理解的css高级技巧有哪些&#xff1f; 各种动画效果&#xff0c;能用css的都可以不去用js写的&#xff0c;对我来说就很高级个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

[css] 举例说明跟字体相关的属性有哪些

[css] 举例说明跟字体相关的属性有哪些 font-size&#xff1a;字体大小 font-weight&#xff1a;字体粗细 font-family&#xff1a;字体类型 color&#xff1a;字体颜色 等等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很…

python 文件读写(追加、覆盖)

很明了的一个常用参数图标&#xff1a; 更像细的一个参数说明&#xff1a; 由于文件读写时都有可能产生IOError&#xff0c;一旦出错&#xff0c;后面的f.close()就不会调用。所以&#xff0c;为了保证无论是否出错都能正确地关闭文件&#xff0c;我们可以使用try ... finally来…

职场篇:失败之后

前言 当我写下这个题目之后&#xff0c;我想到了一首歌词"长大以后&#xff0c;我只能奔跑&#xff0c;我多害怕 黑暗中跌倒 "&#xff0c;我不由得哼起这首歌&#xff0c;一种心痛孜然而生。 我也想到了一本小说《飞升之后》&#xff0c;讲述主人公飞升后&#xf…

h5页面调用cmd命令并隐藏cmd弹窗

/*** 通过js调用cmd命令利用ffmpeg实现录屏或者录像功能 ***/ var cmd new ActiveXObject("WScript.Shell");/*命令参数说明cmd.exe /c dir 是执行完dir命令后关闭命令窗口。cmd.exe /k dir 是执行完dir命令后不关闭命令窗口。cmd.exe /c start dir 会打开一个新窗…