国际通用信息标记有三种形式:XML JSOM YAML
信息提取的一般方法:
方法一: 完整解析信息的标记形式,再提取关键信息
        XML JSON YAML
        需要标记解析器,例如:bs4库的标签树遍历
        优点:信息解析准确
        缺点:提取过程繁琐,速度慢
方法二: 无视标记形式,直接搜索关键信息
        搜索
        对信息的文本查找函数即可
        优点:提取过程简洁,速度较快
        缺点:提取结果准确性与信息内容相关
融合方法:结合形式解析与搜索方法,提取关键信息
        XML JSON YAML 搜索
        需要标记解析器及文本查找函数

<>.find_all(name, attrs, recursive, string, **kwargs)
∙ name : 对标签名称的检索字符串 返回一个列表类型,存储查找的结果
∙ attrs: 对标签属性值的检索字符串,可标注属性检索
∙ recursive: 是否对子孙全部检索,默认True
∙ string: <>…</>中字符串区域的检索字符串

<tag>(..) 等价于 <tag>.find_all(..)
soup(..) 等价于 soup.find_all(..)

扩展方法:
方法                        说明
<>.find()                   搜索且只返回一个结果,同.find_all()参数
<>.find_parents()           在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent()            在先辈节点中返回一个结果,同.find()参数
<>.find_next_siblings()     在后续平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_next_sibling()      在后续平行节点中返回一个结果,同.find()参数
<>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_previous_sibling()  在前序平行节点中返回一个结果,同.find()参数

code:

import requests
import re
from bs4 import BeautifulSoup


r = requests.get("http://python123.io/ws/demo.html")
r.encoding = r.apparent_encoding
demo = r.text
soup = BeautifulSoup(demo, "html.parser")

for link in soup.find_all('a'):
    print(link.get('href'))
print(soup.find_all(['a', 'b']))

print(soup.find_all(id='link'))
print(soup.find_all(id = re.compile('link')))   # 包含正则表达式内容,查找所有属性值中有link的内容

print(soup.find_all('a'))
print(soup.find_all('a', recursive=False))

print(soup)
print(soup.find_all(string='Basic Python'))
print(soup.find_all(string=re.compile('python')))