我们上次做了


你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍


有些朋友觉得


利用正则表达式去提取信息


太特么麻烦了


python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了_java


有没有什么别的方式


更方便过滤我们想要的内容啊


emmmm


你还别说


还真有


有一个高效的网页解析库


它的名字叫做


BeautifulSoup



那可是


python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了_java_02



是一个可以从 HTML 或 XML 文件中提取数据的 Python 库


那么这么玩呢


...



接下来就是


学习python的正确姿势


python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了_java_03



首先我们要安装一下这个库


pip install beautifulsoup4


beautifulsoup支持不同的解析器


比如


对 HTML 的解析


对 XML 的解析


对 HTML5 的解析


你看


python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了_java_04



一般情况下


我们用的比较多的是 lxml 解析器


我们先来使用一个例子


让你体验一下


beautifulsoup 的一些常用的方法


可流弊了呢


python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了_java_05


比如我们有这样一段 HTML 代码


html_doc = """

<html><head><title>学习python的正确姿势</title></head>
<body>
<p class="title"><b>小帅b的故事</b></p>

<p class="story">有一天,小帅b想给大家讲两个笑话
<a href="http://example.com/1" class="sister" id="link1">一个笑话长</a>,
<a href="http://example.com/2" class="sister" id="link2">一个笑话短</a> ,
他问大家,想听长的还是短的?</p>

<p class="story">...</p>

"""

在不使用 re 来进行正则表达式的情况下


如何快速获取到我们想要的内容呢?


先安装一下


pip install beautifulsoup4

pip install lxml


接着将 html 的源代码传给 BeautifulSoup


soup = BeautifulSoup(html_doc,'lxml')



此时此刻


就不需要自己写正则匹配了


python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了_java_06


我们要做的就是从这个对象直接获取我们要的内容


获取标题的内容


print(soup.title.string)
#学习python的正确姿势



获取 p 标签里面的内容


print(soup.p.string)
#小帅b的故事


获取 title 的父级标签


print(soup.title.parent.name)
#head


获取超链接


print(soup.a)
#<a class="sister" href="http://example.com/1" id="link1">一个笑话长</a>


获取所有超链接


print(soup.find_all('a'))
#[<a class="sister" href="http://example.com/1" id="link1">一个笑话长</a><a class="sister" href="http://example.com/2" id="link2">一个笑话短</a>]


获取 id 为 link2 的超链接


print(soup.find(id="link2"))
#<a class="sister" href="http://example.com/2" id="link2">一个笑话短</a>



获取网页中所有的内容


print(soup.get_text())

# 学习python的正确姿势

小帅b的故事
有一天,小帅b想给大家讲两个笑话
一个笑话长,
一个笑话短 ,
他问大家,想听长的还是短的?
...



除了find方法之外


如果你对css比较熟悉


也可以使用 select 方法


soup = BeautifulSoup(html_doc,'lxml')

print(soup.select("title"))
print(soup.select("body a"))
print(soup.select("p > #link1"))



以上就是 BeautifulSoup 常用的方法


想进一步了解可以到这


https://www.crummy.com/software/BeautifulSoup/bs4/doc/


有了它


妈妈再也不用担心我的正则表达式了


下次还有人这样问你


年轻人,不会正则表达式你睡得着觉?有点出息没有?


你可以傲娇的告诉他


python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了_java_07



睡得着



本篇完


再见