Python3爬虫学习笔记(4.BeautifulSoup库详解)

这是一个功能强大的库,可以代替很多需要写正则的地方

这是一个第三方解析库,常规安装方法:

调出cmd:pip install bs4


简单了解:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>TITLE</title>
</head>
<body>
<table border="1">
    <tr>/
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

#自动补全修正html文本
print(soup.prettify())
#获得html的标题
print(soup.title.string)


标签选择器:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>TITLE</title>
</head>
<body>
<table border="1">
    <tr>/
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.title)
#<title>TITLE</title>
print(soup.head)
'''
<head>
<meta charset="utf-8"/>
<title>TITLE</title>
</head>
'''
print(soup.td)
#只能获取第一个,所以打印:<td>第一行,第1列</td>

获取属性:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>/
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.table["border"])
#1

获取内容:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.table.tr.td.string)
#第一行,第1列

子节点:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.table.tr.contents)
#['\n', <td>第一行,第1列</td>, '\n', <td>第一行,第2列</td>, '\n', <td>第一行,第3列</td>, '\n']
另外一种:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for i, child in enumerate(soup.table.tr.children):
    print(i, child)
'''
0

1 <td>第一行,第1列</td>
2

3 <td>第一行,第2列</td>
4

5 <td>第一行,第3列</td>
6

可以看出.children实际上是一个迭代器。
'''

子孙节点:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for i, child in enumerate(soup.table.descendants):
    print(i, child)
'''
0

1 <tr>
<td>第一行,第1列</td>
<td>第一行,第2列</td>
<td>第一行,第3列</td>
</tr>
2

3 <td>第一行,第1列</td>
4 第一行,第1列
5

6 <td>第一行,第2列</td>
7 第一行,第2列
8

9 <td>第一行,第3列</td>
10 第一行,第3列
11

12
'''

父节点:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.tr.parent)
'''
<table border="1">
<tr>
<td>第一行,第1列</td>
<td>第一行,第2列</td>
<td>第一行,第3列</td>
</tr>
</table>
'''

兄弟节点:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td>第一行,第1列</td>
        <td>第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(list(enumerate(soup.td.next_siblings)))
#[(0, '\n'), (1, <td>第一行,第2列</td>), (2, '\n'), (3, <td>第一行,第3列</td>), (4, '\n')]
print(list(enumerate(soup.td.previous_siblings)))
#[(0, '\n')]

标准选择器(实用):

find_all详解:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table border="1">
    <tr>
        <td id="1">第一行,第1列</td>
        <td class="c1">第一行,第2列</td>
        <td>第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all("td"))
#[<td>第一行,第1列</td>, <td>第一行,第2列</td>, <td>第一行,第3列</td>]
#可以遍历输出,这里不写了(td标签里面的内容是后边临时加的)

print(soup.find_all(attrs={"id": "1"}))
#[<td id="1">第一行,第1列</td>](临时加的id)

print(soup.find_all(id="1"))
#[<td id="1">第一行,第1列</td>]

print(soup.find_all(class_="c1"))
#[<td class="c1">第一行,第2列</td>](临时加的class)
#注意这里要加上下划线

print(soup.find_all(text="第一行,第3列"))
#['第一行,第3列']

find方法类似,只不过是把find_all方法获取的列表里面的第一个元素拿出来了,这里就不仔细写了。


CSS选择器:

html = """
<html lang="en"><head>
    <meta charset="UTF-8">
    <title>666</title>
</head>
<body>
<table class="c0" border="1">
    <tr id="0">
        <td id="1">第一行,第1列</td>
        <td id="2" class="c1">第一行,第2列</td>
        <td id="3">第一行,第3列</td>
    </tr>
</table>
</body>
</html>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select("tr td"))
#[<td id="1">第一行,第1列</td>, <td class="c1">第一行,第2列</td>, <td>第一行,第3列</td>]

print(soup.select(".c0 .c1"))
#[<td class="c1">第一行,第2列</td>]

print(soup.select("#0 .c1"))
#[<td class="c1">第一行,第2列</td>]

for td in soup.select("td"):
    print(td["id"])
#临时加入的三个id,会遍历输出1,2,3

for td in soup.select("td"):
    print(td.get_text())
"""
第一行,第1列
第一行,第2列
第一行,第3列
"""



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值