`
cnDenis
  • 浏览: 100342 次
  • 来自: 广州
社区版块
存档分类
最新评论

用Python解析HTML,BeautifulSoup使用简介

阅读更多

 

用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提供了findfind_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.atag("a")

  • 列表: 可以按一个字符串列表查找,返回名字匹配任意一个字符串的标签。例如 tag("h2", "p")

  • 键-值: 可以用tag(key=value)的形式,来按标签的属性查找。键-值查找里有比较多的小花招,这里列几条:

    1. class
      class是Python的保留字,不能当变量名用,偏偏在HTML中会有很多 class=XXX 的情况,BeautifulSoup的解决方法是加一下划线,用 class_ 代替,如 tag(class_=XXX)
    2. True
      当值为True时,会匹配所有带这个键的标签,如 tag(href=True)
    3. text
      text做为键时表示查找按标签中的文本查找,如 tag(text=something)
  • 正则表达式: 例如 tag(href=re.compile("elsie"))

  • 函数: 当以上方法都行不通时,函数是终极方法。写一个以单个标签为参数的函数,传入 findfind_all 进行查找。如

    def fun(tag):
        return tag.has_key("class") and not tag.has_key("id")
    tag(fun) # 会返回所有带class属性但不带id属性的标签
    

再来一碗——按文档的结构查找

HTML可以解析成一棵标签树,因此也可以按标签在树中的相互关系来查找。

  • 查找上层节点:find_parents()find_parent()

  • 查找下一个兄弟节点:find_next_siblings()find_next_sibling()

  • 查找上一个兄弟节点:find_previous_siblings()find_previous_sibling()

以上四个都只会查同一父节点下的兄弟

  • 查找下层节点:其实上面说的find和find_all就是干这活的

  • 查找下一个节点(无视父子兄弟关系) find_all_next()find_next()

  • 查找上一个节点(无视父子兄弟关系) find_all_previous()find_previous()

以上的这些查找的参都和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

  • BeautifulSoup 在解析之前会先把文本转换成unicode,可以用 from_encoding 指定编码,如:BeautifulSoup(markup, from_encoding="iso-8859-8")

  • soup.prettify()可以输出排列得很好看的HTML文本,遇上中文的话可以指定编码使其显示正常,如 soup.prettify("gbk")

  • 还是有编码问题,看:http://www.crummy.com/software/BeautifulSoup/bs4/doc/#unicode-dammit

 

0
0
分享到:
评论

相关推荐

    Pythonspider, 一个简单的python爬虫,原生python BeautifulSoup.zip

    3. **解析HTML**:用BeautifulSoup解析HTML,构建DOM树。 4. **数据提取**:使用CSS选择器或XPath表达式定位需要的HTML元素,提取元素中的数据。 5. **数据存储**:将提取的数据保存到本地文件、数据库或云存储中,...

    从DOM分析,使用python开始爬取央视新闻网站.pdf

    示例代码中,首先使用requests.get()方法获取网页的HTML内容,然后用BeautifulSoup解析HTML文本。通过soup.find('ul', class_='nav-list')可以找到新闻分类导航栏的列表,接着可以遍历列表项提取链接。对于新闻列表...

    Python爬虫包BeautifulSoup简介与安装(一)

    BeautifulSoup是Python的一个库,主要用于从网页中提取和解析HTML/XML文档数据。它提供简单直观的API,允许用户轻松地导航、搜索、修改分析树等功能,因此非常适合用于网络爬虫。 2. BeautifulSoup功能: 官方文档...

    Python-爬虫爬取豆果网和美食网的菜单

    3. **解析HTML**: 使用BeautifulSoup解析响应对象,找到包含菜单信息的HTML元素。可能需要多次遍历HTML树,因为菜单可能分布在多个地方。 4. **提取数据**: 使用`find()`或`find_all()`方法找到菜单项,然后使用...

    python爬虫并制作足球可视化图表(含源码)

    1. **Python爬虫**:Python的requests库用于发送HTTP请求,BeautifulSoup库解析HTML或XML文档。通过它们,我们可以获取网页上的数据。首先,我们需要找到提供C罗数据的网站,确定数据所在的HTML元素,然后编写相应的...

    python实现网络爬虫 爬取北上广深的天气数据报告 python.docx

    具体实现过程中,首先定义爬虫函数,使用requests获取网页内容,然后用BeautifulSoup解析HTML,提取出天气信息。对抓取到的数据进行清洗和整理,存储到本地文件或数据库。最后,使用pandas进行数据分析,并结合...

    通过python爬虫批量下载PDF文件

    接着,BeautifulSoup库在网页解析中扮演重要角色。它允许我们解析HTML或XML文档,找到特定的元素,如链接。在寻找PDF文件的下载链接时,我们可以利用BeautifulSoup查找包含特定关键词(例如"下载"或"PDF")的a标签,...

    【苹果IP代理】 8大高效的Python爬虫框架,你用过几个?.docx

    - **适用场景**:适用于需要频繁解析HTML或XML文档的项目,如网页内容抓取、数据清洗等。 #### 八、Grab:多功能网页抓取框架 - **特点**:Grab不仅是一个简单的HTTP客户端,更是一个完整的网页抓取框架,支持复杂...

    用爬虫爬取豆瓣电影TOP250,并用PythonTkinter实现GUI展示与电影信息检索

    在Python中,我们通常使用`requests`库来发送HTTP请求,获取网页内容,然后使用`BeautifulSoup`或`lxml`等解析库解析HTML或XML文档。对于豆瓣电影Top250,我们需要访问其网页并解析电影的相关信息,如电影名、评分、...

    基于Python的豆瓣图书评论数据获取与可视化分析.pdf

    - `BeautifulSoup`库:这是一个用于解析HTML和XML文档的库。通常用于处理从网站获取的复杂的数据。以下是使用BeautifulSoup进行网页解析的基本步骤: ```python from bs4 import BeautifulSoup soup = ...

    用Python写网络爬虫 pdf

    此外,还介绍了如何解析HTML和XML文档,使用BeautifulSoup库提取网页数据。 第3章 下载缓存:本章重点讲述如何实现有效的下载管理,包括保存网页内容到本地、设置下载目录、避免重复下载,以及使用缓存机制提高爬虫...

    python 爬虫爬小电影(只用于学习)

    2. **BeautifulSoup库**:这是一个用于解析HTML和XML文档的库,它能让我们方便地遍历和查找文档树中的元素。例如,我们可以使用`soup.find_all('tag')`来查找所有特定标签的元素,或者使用CSS选择器`soup.select('...

    python爬虫开发 - 爬取小说网站玄幻小说排行信息案例

    首先,Python作为一种强大的脚本语言,拥有众多库支持网络爬虫的开发,如requests用于发送HTTP请求,BeautifulSoup或lxml用于解析HTML文档,还有pandas用于数据清洗和存储。在这个案例中,我们可能首先会学习如何...

    python spider 多线程爬虫 帐号密码登陆爬取简单例子

    在这个例子中,我们可能使用了requests库进行HTTP请求,以及可能使用了lxml或BeautifulSoup解析HTML内容。 2. **多线程**: Python的`threading`模块提供了创建和管理线程的功能。在爬虫中,我们可以为每个需要...

    基于python的网络爬虫简单实现

    例如,使用`requests`发送请求,并用`BeautifulSoup`解析HTML文档: ```python import requests from bs4 import BeautifulSoup def fetch_page(url): # 发送请求并获取页面内容 response = requests.get(url) ...

    python 爬虫(电影排行,图片)

    可以使用BeautifulSoup或者PyQuery库来解析HTML文档,找到相关的DOM元素,再配合正则表达式或XPath来提取数据。 对于动态加载的内容,可能需要使用Scrapy的中间件或者Selenium库来处理JavaScript渲染。例如,豆瓣...

    python爬取豆瓣top250并下载图片

    3. **解析HTML**:使用`BeautifulSoup`解析HTML内容。可以使用CSS选择器或XPath表达式定位到包含电影信息的元素,如电影名称、评分、简介等。 4. **提取数据**:遍历解析后的HTML结构,提取每部电影的相关信息,如...

    Python爬虫、Flask框架与ECharts实现数据可视化

    Python有许多库支持爬虫开发,如BeautifulSoup、Scrapy和Requests等。本项目可能使用了这些库来抓取豆瓣(douban.com)上的数据,例如书籍信息、评分、评论等。 **Flask框架**:Flask是一个轻量级的Python Web...

    python食物数据爬取及分析(源码、爬取数据、数据可视化图表、报告)

    针对描述中提到的网站`http://db.foodmate.net/yingyang/`,可能需要解析HTML或者JSON格式的数据,这就需要用到如BeautifulSoup或Scrapy等爬虫框架。在解析过程中,我们需要定位到目标数据所在的HTML元素,提取出...

    Python爬虫数据可视化分析大作业.zip

    在这个项目中,可能会用到如`requests`库来发送HTTP请求获取网页数据,`BeautifulSoup`或`lxml`库解析HTML内容,以及`re`正则表达式处理和提取所需数据。 2. **Flask框架**:Flask是一个轻量级的Web服务器网关接口...

Global site tag (gtag.js) - Google Analytics