pip install beautifulsoup4
构建一个BeautifulSoup对象
复制代码
- >>> from bs4 import BeautifulSoup
- >>> soup = BeautifulSoup(html_doc, 'html.parser')
第二个参数表示解析器,BeautifulSoup支持以下
BeautifulSoup类的基本元素
复制代码
- Tag:标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
- Name:标签的名字,<p>...</p>的名字是'p',格式:<tag>.name
- Attributes:标签的属性,字典的形式组织,格式:<tag>.attrs
- NavigableString:标签内非属性字符串,<>...</>中字符串,格式:<tag>.string
- Comment:标签内字符串的注释部分,一种特殊的Comment类型
任何存在于HTML语法中的标签都可以用soup.
每个
Tag的attrs:一个
NavigableString可以跨越多个层次;
访问标签
通过点号操作符,可以直接访问文档中的特定标签
复制代码
- >>> soup = BeautifulSoup(html_doc, 'lxml')
- >>> soup.head
- <head><title>The Dormouse's story</title></head>
- >>> soup.head.title
- <title>The Dormouse's story</title>
- >>> soup.a
- <a class="sister" href="http://boxmoe.com/elsie" id="link1">Elsie</a>
这样的方式每次只会返回文档中的第一个标签,
对于多个标签,则通过find_all方法返回多
个标签构成的列表。
复制代码
- >>> soup.find_all('a')
- [<a class="sister" href="http://boxmoe.com/elsie" id="link1">Elsie</a>, <a class="sister" href="http://boxmoe.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://boxmoe.com/tillie" id="link3">Tillie</a>]
- >>> soup.find_all('a')[0]
- <a class="sister" href="http://boxmoe.com/elsie" id="link1">Elsie</a>
还可以在find方法中添加过滤条件,更加精确的
定位元素
复制代码
- # 通过text进行筛选
- >>> soup.find_all('a', text='Elsie')
- [<a class="sister" href="http://boxmoe.com/elsie" id="link1">Elsie</a>]
- # 通过属性和值来进行筛选
- >>> soup.find_all('a', attrs={'id':'link1'})
- [<a class="sister" href="http://boxmoe.com/elsie" id="link1">Elsie</a>]
- # 上述写法的简便写法,只适合部分属性
- >>> soup.find_all('a', id='link1')
- [<a class="sister" href="http://boxmoe.com/elsie" id="link1">Elsie</a>]
- ```
- # 使用CSS选择器
- # 注意class后面加下划线
- >>> soup.find_all('p', class_='title')
- [<p class="title"><b>The Dormouse's story</b></p>]
访问标签内容和属性
通过name和string可以访问标签的名字和内容,通过get和中括号操作符则可以访问标签中的属性和值。
复制代码
- >>> soup.a
- <a class="sister" href="http://boxmoe.com/elsie" id="link1">Elsie</a>
- >>> soup.a['class']
- ['sister']
- >>> soup.a.get('class')
- ['sister']
- >>> soup.a.name
- 'a'
- >>> soup.a.string
- 'Elsie'
结合定位元素和访问属性的方法,可以方便快捷的提取对应元素,提高解析html的便利性
使用Beautiful Soup库解析网页示例
复制代码
- import requests
- import chardet
- from bs4 import BeautifulSoup
- ua = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
- rqg=requests.get(url,headers=ua,timeout=3.0)
- rqg.encoding = chardet.detect(rqg.content)['encoding'] #requests请求过程
- #初始化HTML
- html = rqg.content.decode('utf-8')
- soup = BeautifulSoup(html, 'lxml') #生成BeautifulSoup对象
- print('输出格式化的BeautifulSoup对象:',soup.prettify())
- print('名为title的全部子节点:',soup.find_all("title"))
- print('title子节点的文本内容:',soup.title.string)
- print('使用get_text()获取的文本内容:',soup.title.get_text())
- target = soup.find_all('ul',class_='menu') #按照css类名完全匹配
- target = soup.find_all(id='menu') #传入关键字id,搜索符合条件的节点
- target = soup.ul.find_all('a') #所有名称为a的节点
BeautifulSoup解析内容同样需要将请求和解析分开,从代码清晰程度来讲
还将就,不过在做复杂的解析时代码略显繁琐
评论(0)
暂无评论