使用BeautifulSoup提取html网页内容
接着介绍,如何用BeautifulSoup
去提取HTML网页中的特定内容。
举例:
假设有html如下:
<li class="clearfix"><span>2020-12-31</span>
<a ahref="/xsglxt/f/jyxt/anony/showZwxx?zpxxid=104719161&type=" href="javascript:void(0)" style="color:#ff0000;" fbfw="外">2019-2020年度全国各地选调生招录、事业单位人才引进信息汇总————全国各地选调生信息汇总</a>
</li>
<li class="clearfix"><span>2020-12-31</span>
<a ahref="/xsglxt/f/jyxt/anony/showZwxx?zpxxid=41174064&type=" href="javascript:void(0)" style="color:#ff0000;" fbfw="外">学术就业相关资讯————清华大学学生职业发展指导中心</a>
</li>
...
需要:提取中的li
中的a
的ahref
值和文本内容content
用BeautifulSoup提取html的典型步骤
先从html中解析出soup:
from bs4 import BeautifulSoup
soup = BeautifulSoup(inputHtml, 'html.parser')
再去从soup中提取对应的元素
比如找到所有的li
的元素
foundLiList = soup.find_all('li', attrs={"class": "clearfix"})
或:
foundLiList = soup.find_all('li', class_="clearfix")
说明:为了防止和Python保留字
class
冲突,所以改为class_
找到了li
后,再去找其中的a
元素
foundA = eachLi.find("a", attrs={"fbfw":"外"})
或者是:直接找li
中的a
元素
foundAList = soup.find_all('a', attrs={"fbfw":"外"})
或者再加上额外限定条件:a
中存在属性ahref
,且值非空
此处搜索条件中,用上了正则的写法
import re
ahrefNonEmptyP = re.compile("\S+")
foundAList = soup.find_all('a', attrs={"fbfw":"外", "ahref": ahrefNonEmptyP})
注:如果想要查找 有ahref
属性,但值无所谓,任意值均可,则可以用:True
,表示存在此属性
foundAList = soup.find_all('a', attrs={"fbfw":"外", "ahref": True})
以及也可以加上style值的限定:
ahrefNonEmptyP = re.compile("\S+") # ahref="/xsglxt/f/jyxt/anony/showZwxx?zpxxid=104719161&type="
styleColorP = re.compile("color:#[a-zA-Z0-9]+;") # style="color:#ff0000;"
foundAList = soup.find_all('a', attrs={"fbfw":"外", "ahref": ahrefNonEmptyP, "style": styleColorP})
然后对于find_all
找到的是列表,每个元素类型是tag:
<class 'bs4.element.Tag'>
然后对于每个tag
去通过字典获取属性值, 有2种写法:
- 直接用属性调用
ahref = eachA["ahref"]
- 通过
attrs
字典属性ahref = eachA.attrs["ahref"]
通过string
获取文本值
:
contentStr = eachA.string
即可获取到需要的值:
# ahref=/xsglxt/f/jyxt/anony/showZwxx?zpxxid=104719161&type=
# contentStr=2019-2020年度全国各地选调生招录、事业单位人才引进信息汇总————全国各地选调生信息汇总
如上,就是基本和典型的BeautifulSoup的soup的用法了。