BeautifulSoup解析HTML
1、从网上获取数据:
直接上代码,由于这里不讲爬虫相关的知识,所以就不细讲了。说明以下几点:
1. url指向的为你想爬取的网页地址;
2. translation_html为网页地址所对应的html代码,所对应的页面对下图;
3. 要介绍的BeautifulSoup就是对第2点中translation_html的内容进行解析。
---------------代码分割线---------------
import urllib.request as rq
url = "https://www.baidu.com"
req = rq.Request(url, headers={ 'Connection': 'Keep-Alive', 'Accept': 'text/html, application/xhtml+xml, */*', 'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' })
translation_html = rq.urlopen(req).read().decode("utf-8")

2、安装并导入BeautifulSoup:
可以通过pip命令直接安装:
pip install beautifulsoup4
如果还想解析html以外格式的一些文档,可以再安装其它的库,如:
$ pip install lxml
$ pip install html5lib
安装好后,要在python(.py)文件中使用BeautifulSoup的各项功能前,还需要在.py文件中用以下语句把BeautifulSoup库进行导入。
from bs4 import BeautifulSoup

3、我们已经从第一步获取了要解析的HTML代码,从第二步安装并导入了BeautifulSoup库,接下来就可以使用BeautifulSoup库所提供的功能,对HTML的内容进行解析了。为了方便说明,这里不讲原理性的东西,都是以举例的方式让大家看得明白。

4、先看一段代码:
from bs4 import BeautifulSoup # 导入BeautifulSoup库
soup = BeautifulSoup(translation_html, "html.parser") # translation_html为第一步得到的html代码,"html.parser"说明我们解析的内容为html格式的。
为了使说明更简洁,translation_html所对应的HTML代码看成以下内容:
<html>
<body>
<div id='div1'>
<p class='p1 first'>p1 content<!-- p1 comment -->
<p class='p2 second'>p2 content
</div>
</body>
</html>
接下来的说明就围绕这段代码来说明BeautifulSoup的解析过程。

5、soup = 返回BeautifulSoup对象:整个html代码(从<html>到</html>)
soup("div") = 查找所有div元素,返回列表:第1个元素为(从<div id='div1'>到</div>)的代码
soup.div = 查找第一个div元素,返回BeautifulSoup对象:(从<div id='div1'>到</div>)
soup("p") = 查找所有p元素,返回列表:第1个元素为"<p class='p1'>p1 content",第二个元素为"<p class='p2'>p2 content"。
soup.div("p", recursive=False) = 查找div下直属p元素,返回列表:第1个元素为"<p class='p1'>p1 content",第二个元素为"<p class='p2'>p2 content"。
soup.p = 查找第一个p元素,返回BeautifulSoup对象(<p class='p1'>p1 content)
注意:上述返回列表中的每个元素也是BeautifulSoup对象。可以把返回的BeautifulSoup对象看成是一个原HTML上的子HTML。在这个子对象上的操作方法和最初的对象是一样的。

6、soup("p", attrs={"class": "p2"}) = 在soup("p")的基础上加了一个限定条件,可以把查找的范围更精确化。返回值也是一个列表。相当于soup.findAll(...)。属性值还可以接受正则表达式:如上述的"p2"可以被替换为s【s = re.compile(r'fir')】
soup.find("p", attrs={"class": "p2"}) = 返回上面列表中的第一元素。
attrs参数的内容可以有多个,如id,class,name什么都可以加进入,以最大限度的精确查找。

7、soup.p['class'] = 返回第一个p元素的class属性列表(['p1', 'first'])
soup.p.text = 返回第一个p元素的内容(p1 content),注意不包含注释的内容
以上就是BeautifulSoup库的基本用法,相信通过大家的举一反三,应该能够完成你想要的功能了。
