爬虫过程中解析html 获取关注信息,常用的方法有正则匹配re、xpath、BeautifualSoup,
re 正则,规则每次用都需要查(我比较菜)
xpath,运行比较快
BeautifualSoup,简单粗暴,我喜欢
以下是我的理解,之说我用到的方法,不全面但使用
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
response.text 是获取到的html文本信息
html.parse 是 使用python 内置的html解析器, 第二个参数也可以写成 'lxml' 用lxml解析器解析, (可以理解为html是特殊的xml)
上例子:
https://www.dxsbb.com/news/44368.html
1. prettify()
要拿到上述连接中 大学排名的顺序信息,直接网页右键 查看网页源代码,格式非常的乱,不好找规律,这个时候可以用到一个方法格式化网页的源码输出,对比一下两个的效果:
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify())
2. 定位元素信息 find()、find_all()、select()
find() 是查找到第一个匹配的元素,模糊匹配
find_all() 是查找全部匹配的元素 返回一个soup列表,模糊匹配
select() 与find类似 是精准匹配
上例子:
上述连接中没有找到可用的例子,所以网上找了一个图 ,小图一上,清晰明了
soup.find(name='td',class_='bar') # 实际定位到的
soup.select('td[class="bar"]') # 查找的
根据上述格式化之后的html、找到表格中数据规则 每一行开始都是 <tr class="alt">,里边包裹的是<td>中是真实的值,找到规则之后可以如下方式获取
soup = BeautifulSoup(response.text, 'html.parser')
listTemp = [] # 将所有信息存储在列表中
trTag = soup.find_all(name='tr', class_='alt') # 找到每一行的信息,返回一个列表
for tr in trTag:
subTemp = [] # 将一行信息中的每个值,保存在列表中
for tdTag in tr.find_all('td'): # 一行信息有多个 td,一个td包裹一个值
subTemp.append(tdTag.text) # tag.text 获取内容,
listTemp.append(subTemp) # 将一行的信息存入总的列表中
for i in listTemp: # 打印 所有的值
print(i)
3. 另外几个常用的方法
3.1 打印获取到的特定一块html区域
soup = BeautifulSoup(response.text, 'html.parser')
trTag = soup.find_all(name='tr', class_='alt')
print(trTag[0].prettify()) # 打印第一个tr标签中的html文本
<tr class="alt">
<td>
1
</td>
<td>
<div>
清华大学
</div>
</td>
<td>
<div>
北京
</div>
</td>
<td>
<div>
综合
</div>
</td>
<td>
<div>
852.5
</div>
</td>
</tr>
3.2 获取标签的属性
soup.a.attrs 获取a所有的属性和属性值,返回一个字典
soup.a.attrs['href'] 获取href属性, 可以简写成soup.a['href]
3.3 获取标签的内容
soup.a.string ,获取质数内容, 比如 <a href ="xxxx"> a标签的直属内容</a>
soup.a.text ,获取所有内容, 比如 <a href ="xxxx"> <h1>非a标签的直属内容</h1></a>, 这就可以解释上述例子中,为啥没有考虑<div>这个标签了