牛叔叔 的笔记

好好学习

2021-07-10 12:45

总结BeautifulSoup的常用方法(一)

牛叔叔

Python

(755)

(0)

收藏

blog

Beautiful Soup 是 python 的一个库,是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间。(来自Beautiful Soup文档https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/


安装:

pip install beautifulsoup4


程序中使用Beautiful Soup ,首先需要导入:

from bs4 import BeautifulSoup


创建BeautifulSoup对象:

soup = BeautifulSoup(html,"html.parser")

这里html是一段文本,比如抓取到的网页源码。html.parser是Python标准库中提供的html解析器。

为了介绍各种方法,我们假设html 文本内容如下:

html = '''
<html>
<head><title>万码学堂</title></head>
<body>
    <h1>BeautifulSoup演示</h1>
    <div class="content">
        <h1>这是正文</h1>
        <!--这是注释-->
        <p>
            这是内容
            <img src="http://www.wanmait.com/images/a.jpg">
        </p>
        <ul>
            <li>列表0</li>
            <li id="wanmait"><a href="http://wanmait.com/1.html">列表1</a></li>
            <li><a href="http://wanmait.com/2.html">列表2</a></li>
            <li><a href="http://wanmait.com/2.html">列表3</a></li>
        </ul>
    </div>
    <div>
    <p><a href="http://wanmait.com">万码IT</a></p>
    </div>
</body>
</html>
'''


接下来我们看看Beautiful Soup各种常见方法。(html内容使用以上示例数据)


1、获取页面指定标签的内容:

比如获取标题(<title>内容)

print(soup.title)
print(soup.title.text)

将打印

<title>万码学堂</title>
万码学堂


当然,也可以通过其他标签获取相应的内容,比如:

print(soup.h1)
print(soup.h1.text)

打印的结果是:

<h1>BeautifulSoup演示</h1>
BeautifulSoup演示


注意,当html中多个h1时,显示的是第一个。

如果需要取出所有h1如何操作?

elements = soup.find_all("h1")
for element in elements:
    print(element)

打印的结果是:

<h1>BeautifulSoup演示</h1>
<h1>这是正文</h1>


获取img元素src属性值信息:

elements = soup.find_all("img")
for element in elements:
    print(element["src"])

输出结果:

http://www.wanmait.com/images/a.jpg


2、通过标签的各种属性样式等选择所要内容:


比如获取class是content标签数据

elements = soup.find_all(attrs={"class":"content"})
for element in elements:
    print(element)


输出结果:

<div class="content">
<h1>这是正文</h1>
<!--这是注释-->
<p>
            这是内容
            <img src="http://www.wanmait.com/images/a.jpg"/>
</p>
<ul>
<li>列表0</li>
<li id="wanmait"><a href="http://wanmait.com/1.html">列表1</a></li>
<li><a href="http://wanmait.com/2.html">列表2</a></li>
<li><a href="http://wanmait.com/2.html">列表3</a></li>
</ul>
</div>


获取id是wanmait的元素

elements = soup.find_all(attrs={"id":"wanmait"})
for element in elements:
    print(element)

输出结果:

<li id="wanmait"><a href="http://wanmait.com/1.html">列表1</a></li>



3、通过标签内容获取元素:

我们想获取所有包含“列表”的标签元素

elements = soup.find_all(text=re.compile("列表\d*")) #这里是列表后跟这数字的正则表达式
for element in elements:
    print(element.parent)

输出结果:

<li>列表0</li>
<a href="http://wanmait.com/1.html">列表1</a>
<a href="http://wanmait.com/2.html">列表2</a>
<a href="http://wanmait.com/2.html">列表3</a>



4、获取某元素的内容html

假如我们需要的是所有的p元素内容(不需要外面包裹的<p>)

elements = soup.find_all("p")
for element in elements:
    print(element)

这样显示的是:

<p>
            这是内容
            <img src="http://www.wanmait.com/images/a.jpg"/>
</p>
<p><a href="http://wanmait.com">万码IT</a></p>


这里获取了两个p标签,输出结果带着<p>,如果我们仅仅是需要<p>内部的html,类似于js中的innerHTML,应该怎么获取?

elements = soup.find_all("p")
for element in elements:
    print(element.decode_contents())

结果为:

            这是内容
            <img src="http://www.wanmait.com/images/a.jpg"/>

<a href="http://wanmait.com">万码IT</a>


0条评论

点击登录参与评论