信息提取方法
BeautifulSoup,lxml,re,XPath Selector,CSS Selector
- 正则表达式库
- xpath
- css选择器
#@ 解析HTML页面信息标记与提取
Beautiful soup
把任何文档当成一锅汤并煲制
BeautifulSoup是解析,遍历,维护标签树的功能库
html,标签树,BeautifulSoup类等价
BeautifulSoup对应一个HTML/XML文档的全部内容
使用BeautifulSoup
from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>data</p>','html.parser')
对demo页面进行解析
Beautiful Soup库解析器
解析器 |
使用方法 |
条件 |
bs4的HTML解析器 |
BeautifulSoup(mk,‘html.parser’) |
安装bs4库 |
lxml的HTML解析器 |
BeautifulSoup(mk,‘lxml’) |
pip install lxml |
lxml的XML解析器 |
BeautifulSoup(mk,‘xml’) |
pip install xml |
html5lib的HTML解析器 |
BeautifulSoup(mk,‘html5lib’) |
pip install html5lib |
BeautifuSoup库的基本元素
基本元素 |
说明 |
Tag |
标签,最基本的信息组织单元,分别用<>和</>表明开头和结尾 |
Name |
标签的名字是<p/p> |
Attributes |
标签的属性,字典形式组织 |
NavigableString |
标签内非属性字符串,<>…</>中字符串 |
Comment |
标签内字符串的注释部分 |
获取tag标签
soup = BeautifulSoup(demo , "html.parser")
print(soup.a)
Name
soup.a.name
soup.a.parent.name
soup.a.parent.parent.name
Attrs
soup = BeautifulSoup(demo , "html.parser")
tag = soup.a
print(tag.attrs)
tag.attrs['class']
tag.attrs['href']
NavigableString
soup.p.string
Comment
当html文档中有注释时无法判断是否为注释,输出string时会将注释去掉!–输出
基于bs4库的HTML内容遍历方法
标签树的下行遍历
属性 |
说明 |
.contents |
子节点的列表,将所有儿子节点存入列表 |
.children |
子节点的迭代类型,与.contents类似,用于循环遍历儿子节点 |
.descendants |
子孙节点的迭代类型,包含所有的子孙节点,用于循环遍历 |
import requests
from bs4 import BeautifulSoup
url = "https://www.python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo , "html.parser")
print(soup.body.contents)
soup.body.contents[1]
遍历儿子节点
for child in soup.body.children:
print(child)
遍历子孙节点
for child in soup.body.descendants:
print(child)
标签树的上行遍历
属性 |
说明 |
.parent |
节点的父亲标签 |
.parents |
节点先辈的迭代类型,用于循环遍历先辈节点 |
输出先辈标签名
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
标签树的平行遍历
属性 |
说明 |
.next_sibling |
返回按照HTML文本顺序的下一个平行节点标签 |
.previous_sibling |
返回按照HTML文本顺序的上一个平行节点标签 |
.next_sibilings |
迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 |
.previous_sibilings |
迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 |
平行遍历有条件发生在同一个父节点下的各结点间
任何一个标签的父亲节点或兄弟节点可能是字符串类型
遍历后续节点
for sibling in soup.a.next_siblings:
print(sibling)
遍历前续节点
for sibling in soup.a.previous_siblings:
print(sibling)
HTML内容格式化输出
html内容更加友好的显示,使用utf-8编码
import requests
from bs4 import BeautifulSoup
url = "https://www.python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo , "html.parser")
print(soup.prettify())
CSS Selector
<HTML>.css('a::attr(href)').extract(