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条评论
点击登录参与评论