html页面标签中之中由标记</td>
</tr>
<tr>
<td>bady</td>
<td>页面中<bady>的内容</td>
</tr>
<tr>
<td>p</td>
<td>页面中第一个<p>标签的内容</td>
</tr>
<tr>
<td>strings</td>
<td>页面上所有呈现在web上的字符串,即标签内容</td>
</tr>
<tr>
<td>stripped_strings</td>
<td>所有呈现在web的非空字符串</td>
</tr>
</tbody>
</table>
<p>emmm是不是一脸懵逼进来一脸懵逼出去,最后发现懵逼树下只有你和我。嘎嘎嘎</p>
<p>emmm,小编理解,就是<br /> 实例化对象.标签名 = 标签内容</p>
<p><img src="https://static.coonote.com/2022/07/5825263162728069671.png" class="aligncenter"><br /> 小编没有学过html,以上理解比较片面,如有问题请帮忙指正</p>
<p>接下来以百度ag真人游戏首页为soup进行解释</p>
<pre><code>url = 'http://www.baidu.com'
html = gethtmltext(url)#此处省略了自定义函数
soup = beautifulsoup(html, 'lxml')
print(soup.head)
结果:
<head>
<meta content="text/html;charset=utf-8" http-equiv="content-type"/>
<meta content="ie=edge" http-equiv="x-ua-compatible"/>
<meta content="always" name="referrer"/>
<link href="http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css"
rel="stylesheet" type="text/css"/>
<title>百度一下,你就知道
#把里面第一个标签及里面所有内容都提取出来了
print(soup.title)
结果:
百度一下,你就知道
#第一个标签及内容
print(type(soup.title))
结果:
<class 'bs4.element.tag'>
#这是一个tag对象(标签对象)
print(soup.p)
结果:
<p id="lh">
<a href="http://home.baidu.com">
关于百度
</a>
<a href="http://ir.baidu.com">
about baidu
</a>
</p>
</code></pre>
<p>标签里面的常用属性:</p>
<table>
<thead>
<tr>
<th>属性</th>
<th>返回类型及描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>name</td>
<td>字符串,标签的名字</td>
</tr>
<tr>
<td>attrs</td>
<td>字典,包含了tag里面所有的属性</td>
</tr>
<tr>
<td>contents</td>
<td>列表,这个tag下面所有的tag的内容</td>
</tr>
<tr>
<td>string</td>
<td>字符串,tag所包围的整个文本,网页中的真实文字</td>
</tr>
</tbody>
</table>
<p>举例:还是拿百度ag真人游戏首页做例子</p>
<pre><code>print(soup.a)
结果:
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
print(soup.a.name)
结果:
a
print(soup.a.attrs)
结果:
{
'href': 'http://news.baidu.com', 'name': 'tj_trnews', 'class': ['mnav']}
print(soup.title.name)
结果:
title
print(soup.title.string)
结果:
百度一下,你就知道
print(soup.title.contents)
结果:
['百度一下,你就知道']
</code></pre>
<h5>具体解析</h5>
<p><code>soup.标签名</code><br /> 例:soup.tag<br /> 这里的name就是标签,获得的结果就是html对象的<strong>第一个</strong>该标签的<strong>全部内容</strong><br /> 该对象的类型是tag类型</p>
<p><code>soup.标签名.name</code><br /> 例:soup.tag.name<br /> 结果为 a 类型为字符串</p>
<p><code>soup.标签名.attrs</code><br /> 例:soup.tag.attrs<br /> 返回结果是标签里面的所有信息返回格式为字典<br /> <code>{'href': 'http://news.baidu.com', 'name': 'tj_trnews', 'class': ['mnav']}</code></p>
<p><code>soup.标签名.string</code><br /> 例:soup.tag.string<br /> 返回的为标签里面的内容,返回类型为字符串</p>
<h4>嵌套选择</h4>
<pre><code><head>
<meta content="text/html;charset=utf-8" http-equiv="content-type"/>
<meta content="ie=edge" http-equiv="x-ua-compatible"/>
<meta content="always" name="referrer"/>
<link href="http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
<title>百度一下,你就知道
以以上为例: 解析这是有一个标签对包裹的里面有3个单标签和一个单标签,同时还有一对 标签构成</p>
<p>可以通过<code>soup.tag.tag</code>来嵌套获得子标签内容。获得的类型还是tag类型</p>
<pre><code>print(soup.head.title)
结果:
<title>百度一下,你就知道
print(soup.head.title.string)
结果:
百度一下,你就知道
关联选择
在某些时候需要不能够一次性选择到位 或有几个相同的标签怎么办,那么就用关联选择。
一:子节点 soup.tag.contents 返回列表,把所有的结果都放在一个列表里面
soup.tag.children 返回一个生成器,需要通过for循环来获取各个值 for i in soup.tag.children: print(i)
soup.tag.descendants 子孙节点返回一个生成器
二:父节点 soup.tag.parent 返回列表,返回父节点下面所有的内容(节点元素)
三:祖先节点 soup.tag.parents 返回一个生成器 用for循环进行返回,返回各个祖先节点的所有内容 也可以使用list()进行获得
list(soup.a.parents)
四:兄弟节点 获取后面一个节点 ·soup.tag.next_sibling 返回一个节点元素
获取后面所有的节点 soup.tag.next_siblings 返回一个生成器
获取前面一个节点 soup.tag.previous_sibling 返回一个节点元素
返回前面所有的节点 soup.tag.previous_siblings 返回一个生成器
css选择器
使用方法:soup.select() 即可获取结果 在括号中输入定位元素即可
选择器类型及使用
(1)id选择器使用#定位元素 其中获取该节点可以采用 #list-1 id在html文档中是独一无二存在的
(2)类选择器 还是以上的例子要用class元素进行定位就叫做类选择器 其中用. 来表示 定位ul中的class类就要用ul.list
(3)标签选择器 通过标签进行选择 直接输入需要获取的标签名即可
(4)混合使用 在某些时候,获取需要的标签无法使用一个选择器进行获取时就可以混合使用,以获得所需要的内容
css高级用法
嵌套选择
css选择器获得的结果是一个对象列表所以可以循环嵌套,具体的不在详解 关键是没有一个好的html文本同于解析
属性获取
css返回的是tag类型的对象 所以也可用attrs 获取属性 使用string 获得文本(本节点) 使用strings 获得文本(子孙节点)(返回一个生成器用list()或for循环调用)
方法选择器
find_all()
用于搜索当前节点下所有的符合条件的节点 没有指点节点则是全文
用法: find_all(name, attrs, recursive, text, **kwargs)
name:节点的标签名,查找所有名为name的节点(tag对象)
name使用形式 |
字符串、正则表达式、列表、true(作用) |
字符串 |
默认表示标签名 |
正则表达式 |
用表达式代替标签名,查找所有符合条件的标签内容 |
列表 |
把列表中多个标签全部进行查找 |
true |
所有内容 |
attrs:查询含有属性值的标签 参数类型:字典类型 例:
查询id = link1的标签
soup.find_all(attrs= {
id:'link1'})
结果为soup下所有id=link1的标签内容
**kwargs: 接收常用的属性通过赋值的形式表达 以上面的内容为例
查询id = link1的标签
soup.find_all(id='link1')
查询class = story的标签
soup.find_all(class_ = 'story')
注:因为class是内置函数,传入参数会报错,需要加下划线
text:查询接收的文本标签,是字符串形式 相对应查找你要的内容直接进行检索 直接用与字符串的查找,和word的查找功能类似
查找elsie
soup.find_all(text= 'elsie')
['elsie']
可以用于混合使用
查找a标签中含‘elsie’的内容
soup.find_all('a',text = 'elise')
limit:用于限制返回结果的数量 参数形式整数
recursive:决定是否返回子孙节点的值 类型为布尔型,默认true
find()
find() 返回查询到的第一个元素节点 使用上比find_all()少了一个limit参数其他的基本上一样 返回的结果是一个元素不是列表,而且只获取第一个元素,子孙节点无法获取
其他的方法选择器
其他的方法选择器大致可以表示为find_···() 他们的选择条件不同,不是经常使用掌握好find_all()和find()熟练使用可以满足大部分需求,其他的此处不做过多赘述。
以上内容为个人理解,有问题请及时沟通交流,及时修改!谢谢大家
|