用Python解析HTML,BeautifulSoup使用简介
by cnDenis, http://cndenis.iteye.com,
2012年12月12日
Beautiful Soup,字面意思是美好的汤,是一个用于解析HTML文件的Python库。主页在 http://www.crummy.com/software/BeautifulSoup/
, 下载与安装无需啰嗦,这里就介绍一下它的使用吧。
装汤——Making the Soup
首先要把待解析的HTML装入BeautifulSoup。BeautifulSoup可以接受文件句柄或是字符串作为输入:
from bs4 import BeautifulSoup
fp = open("index.html")
soup1 = BeautifulSoup(fp)
soup2 = BeautifulSoup("<html>data</html>")
汤料——Soup中的对象
标签(Tag)
标签对应于HTML元素,也就是应于一对HTML标签以及括起来的内容(包括内层标签和文本),如:
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
soup.b就是一个标签,soup其实也可以视为是一个标签,其实整个HTML就是由一层套一层的标签组成的。
名字(Name)
名字对应于HTML标签中的名字(也就是尖括号里的第一项)。每个标签都具有名字,标签的名字使用.name
来访问,例如上例中,
tag.name == u'b'
soup.name == u'[document]'
属性(Atrriutes)
属性对应于HTML标签中的属性部分(也就是尖括号里带等号的那些)。标签可以有许多属性,也可以没有属性。属性使用类似于字典的形式访问,用方括号加属性名,例如上例中,
tag['class'] == u'boldest'
可以使用.attrs直接获得这个字典,例如,
tag.attrs == {u'class': u'boldest'}
文本(Text)
文本对应于HTML中的文本(也就是尖括号外的部分)。文件使用.text
来访问,例如上例中,
tag.text == u'Extremely bold'
找汤料——Soup中的查找
解析一个HTML通常是为了找到感兴趣的部分,并提取出来。BeautifulSoup提供了find
和find_all
的方法进行查找。find
只返回找到的第一个标签,而find_all
则返回一个列表。因为查找用得很多,所以BeautifulSoup做了一些很方便的简化的使用方式:
tag.find_all("a") #等价于 tag("a")
tag.find("a") #等价于 tag.a
因为找不到的话,find_all返回空列表,find
返回None
,而不会抛出异常,所以,也不用担心
tag("a")
或 tag.a
会因为找不到而报错。限于python的语法对变量名的规定,tag.a
的形式只能是按名字查找,因为点号.后面只能接变量名,而带括号的形式
tag()
或 tag.find()
则可用于以下的各种查找方式。
查找可以使用多种方式:字符串、列表、键-值(字典)、正则表达式、函数
-
字符串: 字符串会匹配标签的名字,例如 tag.a
或 tag("a")
-
列表: 可以按一个字符串列表查找,返回名字匹配任意一个字符串的标签。例如 tag("h2",
"p")
-
键-值: 可以用tag(key=value)
的形式,来按标签的属性查找。键-值查找里有比较多的小花招,这里列几条:
- class
class
是Python的保留字,不能当变量名用,偏偏在HTML中会有很多
class=XXX
的情况,BeautifulSoup的解决方法是加一下划线,用 class_
代替,如
tag(class_=XXX)
。
- True
当值为True时,会匹配所有带这个键的标签,如 tag(href=True)
- text
text做为键时表示查找按标签中的文本查找,如
tag(text=something)
-
正则表达式: 例如 tag(href=re.compile("elsie"))
-
函数: 当以上方法都行不通时,函数是终极方法。写一个以单个标签为参数的函数,传入 find
或
find_all
进行查找。如
def fun(tag):
return tag.has_key("class") and not tag.has_key("id")
tag(fun) # 会返回所有带class属性但不带id属性的标签
再来一碗——按文档的结构查找
HTML可以解析成一棵标签树,因此也可以按标签在树中的相互关系来查找。
以上四个都只会查同一父节点下的兄弟
以上的这些查找的参都和find
一样,可以搭配着用。
看颜色选汤——按CSS查找
用 .select()
方法,看 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors
一些小花招
- BeautifulSoup 可以支持多种解析器,如lxml, html5lib, html.parser.
如:
BeautifulSoup("<a></b>", "html.parser")
具体表现可参考 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#differences-between-parsers
分享到:
相关推荐
3. **解析HTML**:用BeautifulSoup解析HTML,构建DOM树。 4. **数据提取**:使用CSS选择器或XPath表达式定位需要的HTML元素,提取元素中的数据。 5. **数据存储**:将提取的数据保存到本地文件、数据库或云存储中,...
示例代码中,首先使用requests.get()方法获取网页的HTML内容,然后用BeautifulSoup解析HTML文本。通过soup.find('ul', class_='nav-list')可以找到新闻分类导航栏的列表,接着可以遍历列表项提取链接。对于新闻列表...
BeautifulSoup是Python的一个库,主要用于从网页中提取和解析HTML/XML文档数据。它提供简单直观的API,允许用户轻松地导航、搜索、修改分析树等功能,因此非常适合用于网络爬虫。 2. BeautifulSoup功能: 官方文档...
3. **解析HTML**: 使用BeautifulSoup解析响应对象,找到包含菜单信息的HTML元素。可能需要多次遍历HTML树,因为菜单可能分布在多个地方。 4. **提取数据**: 使用`find()`或`find_all()`方法找到菜单项,然后使用...
1. **Python爬虫**:Python的requests库用于发送HTTP请求,BeautifulSoup库解析HTML或XML文档。通过它们,我们可以获取网页上的数据。首先,我们需要找到提供C罗数据的网站,确定数据所在的HTML元素,然后编写相应的...
具体实现过程中,首先定义爬虫函数,使用requests获取网页内容,然后用BeautifulSoup解析HTML,提取出天气信息。对抓取到的数据进行清洗和整理,存储到本地文件或数据库。最后,使用pandas进行数据分析,并结合...
接着,BeautifulSoup库在网页解析中扮演重要角色。它允许我们解析HTML或XML文档,找到特定的元素,如链接。在寻找PDF文件的下载链接时,我们可以利用BeautifulSoup查找包含特定关键词(例如"下载"或"PDF")的a标签,...
- **适用场景**:适用于需要频繁解析HTML或XML文档的项目,如网页内容抓取、数据清洗等。 #### 八、Grab:多功能网页抓取框架 - **特点**:Grab不仅是一个简单的HTTP客户端,更是一个完整的网页抓取框架,支持复杂...
在Python中,我们通常使用`requests`库来发送HTTP请求,获取网页内容,然后使用`BeautifulSoup`或`lxml`等解析库解析HTML或XML文档。对于豆瓣电影Top250,我们需要访问其网页并解析电影的相关信息,如电影名、评分、...
- `BeautifulSoup`库:这是一个用于解析HTML和XML文档的库。通常用于处理从网站获取的复杂的数据。以下是使用BeautifulSoup进行网页解析的基本步骤: ```python from bs4 import BeautifulSoup soup = ...
此外,还介绍了如何解析HTML和XML文档,使用BeautifulSoup库提取网页数据。 第3章 下载缓存:本章重点讲述如何实现有效的下载管理,包括保存网页内容到本地、设置下载目录、避免重复下载,以及使用缓存机制提高爬虫...
2. **BeautifulSoup库**:这是一个用于解析HTML和XML文档的库,它能让我们方便地遍历和查找文档树中的元素。例如,我们可以使用`soup.find_all('tag')`来查找所有特定标签的元素,或者使用CSS选择器`soup.select('...
首先,Python作为一种强大的脚本语言,拥有众多库支持网络爬虫的开发,如requests用于发送HTTP请求,BeautifulSoup或lxml用于解析HTML文档,还有pandas用于数据清洗和存储。在这个案例中,我们可能首先会学习如何...
在这个例子中,我们可能使用了requests库进行HTTP请求,以及可能使用了lxml或BeautifulSoup解析HTML内容。 2. **多线程**: Python的`threading`模块提供了创建和管理线程的功能。在爬虫中,我们可以为每个需要...
例如,使用`requests`发送请求,并用`BeautifulSoup`解析HTML文档: ```python import requests from bs4 import BeautifulSoup def fetch_page(url): # 发送请求并获取页面内容 response = requests.get(url) ...
可以使用BeautifulSoup或者PyQuery库来解析HTML文档,找到相关的DOM元素,再配合正则表达式或XPath来提取数据。 对于动态加载的内容,可能需要使用Scrapy的中间件或者Selenium库来处理JavaScript渲染。例如,豆瓣...
3. **解析HTML**:使用`BeautifulSoup`解析HTML内容。可以使用CSS选择器或XPath表达式定位到包含电影信息的元素,如电影名称、评分、简介等。 4. **提取数据**:遍历解析后的HTML结构,提取每部电影的相关信息,如...
Python有许多库支持爬虫开发,如BeautifulSoup、Scrapy和Requests等。本项目可能使用了这些库来抓取豆瓣(douban.com)上的数据,例如书籍信息、评分、评论等。 **Flask框架**:Flask是一个轻量级的Python Web...
针对描述中提到的网站`http://db.foodmate.net/yingyang/`,可能需要解析HTML或者JSON格式的数据,这就需要用到如BeautifulSoup或Scrapy等爬虫框架。在解析过程中,我们需要定位到目标数据所在的HTML元素,提取出...
在这个项目中,可能会用到如`requests`库来发送HTTP请求获取网页数据,`BeautifulSoup`或`lxml`库解析HTML内容,以及`re`正则表达式处理和提取所需数据。 2. **Flask框架**:Flask是一个轻量级的Web服务器网关接口...