python爬虫系列(3.5-Beautiful Soup的使用)

139 阅读3分钟

一、使用步骤

1、安装包

pip3 install beautifulsoup4



2、简单的使用

html_doc = """

<html>

<head>

<title>博客</title>

</head>

<body>

<p>分享 Android 技术,也关注 Python 等热门技术。</p>

<p>写博客的初衷:总结经验,记录自己的成长。</p>

<p>你必须足够的努力,才能看起来毫不费力!专注!精致!

</p>

<p class="Blog"><a href="http://wuxiaolong.me/">WuXiaolong's blog</a></p>

<p class="WeChat"><a href="https://open.weixin.qq.com/qr/code?username=MrWuXiaolong">公众号:吴小龙同学</a> </p>

<p class="GitHub"><a href="http://example.com/tillie" class="sister" id="link3">GitHub</a></p>

</body>

</html>

"""

soup = BeautifulSoup(html_doc, "html5lib") # html5lib是解析器

soup.find('p') # 找到第一个p标签

二、几种解析器的区别




三、基本使用

1、基本的html结构

from bs4 import BeautifulSoup

html_doc = """

<ul>

<li class="odd"><a href="aa.html" data-id="1">链接一</a><span>第一个</span></li>

<li class="even"><a href="bb.html" data-id="2">链接二</a><span>第二个</span></li>

<li class="odd"><a href="cc.html" data-id="3">链接三</a><span>第三个</span></li>

<li class="even"><a href="dd.html" data-id="4">链接四</a><span>第四个</span></li>

<li class="odd"><a href="ee.html" data-id="5">链接五</a><span>第五个</span></li>

</ul>

"""

soup = BeautifulSoup(html_doc, 'lxml')

2、find(标签)查找第一个匹配的元素

3、find_all(标签)查找全部的标签

4、使用name获取查找的标签名

print(soup.find('a').name)

5、使用attrs获取attr属性

print(soup.find('a').attrs)

6、使用has_attr判断一个节点是否有该属性

print(soup.find('li').has_attr('class'))

7、使用get_text()获取文本内容

print(soup.find('li').get_text())

8、使用is_empty_element判断标签是否为空

print(soup.find('li').is_empty_element)

三、查找节点的案例(使用的html还是上一章节的)

1、获取全部的tr

trs = soup.find_all('tr')

for tr in trs:

print(tr)

print('-' * 30)

2、获取第二个tr

trs = soup.find_all('tr')[1:2]

for tr in trs:

print(tr)

print('-' * 30)

# 或者使用limit

trs = soup.find_all('tr', limit=2)[1]

print(trs)

3、获取class="even"的

trs = soup.find_all('tr', class_="even")

for tr in trs:

print(tr)

print('-' * 30)

4、使用attrs的方式来写过滤条件<font color="#f00">推荐写法,可以将一切都属性都写在里面</font>

trs = soup.find_all('tr', attrs={'class': 'even'})

for tr in trs:

print(tr)

print('*' * 30)

5、获取全部a标签的href值

a_link_list = soup.find_all('a')

for item in a_link_list:

print(item.attrs['href'])

6、获取全部的职业信息

trs = soup.find_all('tr')

for tr in trs:

tds = tr.find('td')

print(tds.find('a').string)

# 或者使用get_text()

# pring(tds.find('a').get_text())

7、综合案例(提取全部的信息,list返回)

position = []

trs = soup.find_all('tr')

for tr in trs:

tds = tr.find_all('td')

post = {}

title = tds[0].find('a').get_text()

type = tds[1].get_text()

num = tds[2].get_text()

city = tds[3].get_text()

public_time = tds[4].get_text()

post['title'] = title

post['type'] = type

post['num'] = num

post['city'] = city

post['public_time'] = public_time

position.append(post)

print(position)

五、关于提取文本信息的几个对比

string: 获取某个标签下的非标签字符串

strings: 获取某个标签下子孙非标签的字符串

stripped_strings: 获取某个标签下的子孙非标签字符串,并且会去除空格

get_text():获取某个标签下子孙非标签字符