HTML的信息标记:HTML通过预定义的<>...</>标签形式组织不同类型的信息
信息标记的三种形式:XML,JSON,YAML
XML
JSON
subkey如下所示:
JSON实例
YMAL
YMAL: 多行文本
总结来说有以下几种
YMAL实例
三种信息标记形式的比较
XML 最早的通用信息标记语言,可扩展性好,但繁琐;Internet上的信息交互于传递
JSON 信息有类型,适合程序处理(js),较XML简洁;移动应用云端和节点的信息通信,无注释
YAML 信息无类型,文本信息比例最高,可读性好;各类系统的配置文件,有注释易读
信息提取的一般方法
方法一:完整解析信息的标记形式,再提取关键信息
需要标记解析器 例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢
方法二:无视标记形式,直接搜索关键信息对信息的文本查找函数即可
优点:提取过程简洁,速度较快
缺点:提取结果准确性与信息内容相关
融合方法:结合形势解析与搜索方法,提取关键信息
需要标记解析器及文本查找函数
实例:提取HTML中所有的URL链接
思路:
1)搜索到所有<a>标签
2)解析<a>标签格式,提取href后的链接内容
import requests from bs4 import BeautifulSoup kv = {'user-agent':'Mozilla/5.0'} url = "https://python123.io/ws/demo.html" r = requests.get(url,headers = kv) # print(r.status_code) demo = r.text soup = BeautifulSoup(demo,"html.parser") for link in soup.find_all('a'): print(link.get('href'))
基于bs4库的HTML内容查找方法
<>.find_all(name, attrs, recursive, string, **kwargs)
返回一个列表类型,存储查找的结果
name:对标签名称的检索字符串 soup.find_all(['a','b'])
print(soup.find_all('a')) print(soup.find_all(['a','b']))
for tag in soup.find_all(True): print(tag.name) #输出所有标签的名字
import re #re :正则表达式
for tag in soup.find_all(re.compile('b')):#找出所有以b开头的tag print(tag.name)
attrs:对标签属性值的检索字符串,可标注属性检索
print(soup.find_all('p','course')) print(soup.find_all(id='link1'))
print(soup.find_all(id='link'))
[] #不存在
print(soup.find_all(id = re.compile('link')))
recursive:是否对子孙全部检索,默认True,False:只查询根节点的儿子节点,不在往下查询
print(soup.find_all('a'))
print(soup.find_all('a',recursive = False))
[]
string:<>...</>中字符串区域的检索字符串
<tag>(...) 等价于 <tag>.find_all(...) soup(...) 等价于 soup.find_all(...)
print(soup) #全部 print(soup.find_all(string = "Basic Python")) print(soup.find_all(string = re.compile("Python")))#所有包含Python的 print(soup(string = "Basic Python"))
等价于
print(soup.find_all(string = "Basic Python"))
、