实际工作中,我们常遇到提取信息在本地html文件的情况,本文介绍如何读取html文件并进行预处理提取文件中的信息。
读入html文件
from bs4 import BeautifulSoup
#用本地html文件创建soup对象
#soup = BeautifulSoup(open('index.html'))
soup = BeautifulSoup(open('./1.html',encoding='utf-8'),features='html.parser') #features值可为lxml
#可使用str函数将信息转换为字符串信息,方便使用re正则进行处理
html = str(soup)
数据处理
- 使用正则表达式匹配处理
import re
html = str(soup)
pattern = re._compile('<div class="title">.*?<h2>(.*?)</h2>.*?时间:(.*?)</div>.*?id="detail-p"><p>(.*?)</p><p> 来源:(.*?)</p></div>',re.S)
content_list = pattern.findall(html)
content_list
#自定义函数[(),()]格式批量写入csv文件
import csv
def save_content(content_list):
with open('../content.csv','a',encoding='gbk',newline='',errors='ignore') as f:
writer = csv.writer(f)
writer.writerows(content_list)
#写入csv文件
save_content(content_list)
- 使用BeautifulSoup进行解析
#常用解析器:
soup = BeautifulSoup(html,"html.parser")
soup = BeautifulSoup(html,"lxml")
soup = BeautifulSoup(html,"xml")
soup = BeautifulSoup(html,"html5lib")
#把要解析的字符串以标准的缩进格式输出
soup.prettify()
#查找soup对象的第一个p标签
print(soup.p)
#标签的属性name、attrs(所有属性列表)
print(soup.p.name)
print(soup.p.attrs['name'])
print(soup.p['name'])
#获取第一个p节点的文本内容
print(soup.p.string)
#选择节点后再选择子节点,选择head节点下title子节点的内容
print(soup.head.title.string)
#返回p标签下子节点
print(soup.p.children)
for i, child in enumerate(soup.p.children):
print(i, child)
#将p标签下所有直接子节点以列表形式展示
print(soup.p.contents)
#将p标签下递归查询所有子节点
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):
print(i, child)
#返回p标签下父节点
print(soup.p.parent)
#兄弟节点。next_sibling和previous_sibling分别获取节点的下一个和上一个兄弟元素,next_siblings和previous_siblings则分别返回所有前面和后面的兄弟节点的生成器。
print('Next Sibling', soup.a.next_sibling)
print('Prev Sibling', soup.a.previous_sibling)
print('Next Siblings', list(enumerate(soup.a.next_siblings)))
print('Prev Siblings', list(enumerate(soup.a.previous_siblings)))
#css选择器
#按照标签名进行选择
print(soup.select('p'))
#按照标签名和属性选择
print(soup.select('p[class='class类名']'))
#按照类名查找
print(soup.select('.class类名'))
#按照id名查找
print(soup.select(#id名))
#实例
print(soup.select('.panel .panel-heading')) #选择class='panel'下class='panel-heading'节点
print(soup.select('ul li')) #选择ul标签下li节点
print(soup.select('#list-2 .element')) #选择id='list-2'标签下class='element'节点
print(type(soup.select('ul')[0])) #选择名称为ul标签第一个