BeautifulSoup 解析网页: 正则表达
学习资料:
正则表达式, 是处理文本信息的重要工具, 除了 Python, 在其他的程序语言中, 也有十分重要的地位. 如果将正则表达式 + BeautifulSoup, 岂不是完美中的完美, 哈哈. 我们今天就来看看, 在 BeautifulSoup 中如何使用正则表达式, 获取更有难度的信息.
正则表达式 ¶
正则表达式很厉害, 它能用简单的规则匹配到多样化的文本信息. 在做爬虫教程之前, 我特地做了一个正则表达式的教程, 为爬虫做铺垫. 所以有兴趣了解使用正则表达式的朋友, 都可以看看这个非常全的正则教程.
这次的教程有一些表格形式的 HTML, 在表格中, 有一些信息的格式类似, 我们先用 BeautifulSoup 筛选一些, 然后完全可以用正则给匹配出来. 比如你想下载这个页面的图片, 我们就可以将图片形式的 url 个匹配出来. 之后再下载就简单多了.
正则匹配 ¶
我们先读取这个网页. 导入正则模块 re
.
from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
# if has Chinese, apply decode()
html = urlopen("https://unitytutorial.github.io/static/scraping/table.html").read().decode('utf-8')
我们发现, 如果是图片, 它们都藏在这样一个 tag 中:
<td>
<img src="https://unitytutorial.github.io/static/img/course_cover/tf.jpg">
</td>
所以, 我们可以用 soup
将这些 <img>
tag 全部找出来, 但是每一个 img 的链接(src)都可能不同.
或者每一个图片有的可能是 jpg 有的是 png, 如果我们只想挑选 jpg 形式的图片, 我们就可以用这样一个正则
r'.*?\.jpg'
来选取. 把正则的 compile 形式放到 BeautifulSoup 的功能中, 就能选到符合要求的图片链接了.
soup = BeautifulSoup(html, features='lxml')
img_links = soup.find_all("img", {"src": re.compile('.*?\.jpg')})
for link in img_links:
print(link['src'])
"""
https://unitytutorial.github.io/static/img/course_cover/tf.jpg
https://unitytutorial.github.io/static/img/course_cover/rl.jpg
https://unitytutorial.github.io/static/img/course_cover/scraping.jpg
"""
又或者我们发现, 我想选一些课程的链接, 而这些链接都有统一的形式, 就是开头都会有
https://morvan.
, 那我就将这个定为一个正则的规则, 让 BeautifulSoup 帮我找到符合这个规则的链接.
course_links = soup.find_all('a', {'href': re.compile('https://morvan.*')})
for link in course_links:
print(link['href'])
"""
https://unitytutorial.github.io/
https://unitytutorial.github.io/tutorials/scraping
https://unitytutorial.github.io/tutorials/machine-learning/tensorflow/
https://unitytutorial.github.io/tutorials/machine-learning/reinforcement-learning/
https://unitytutorial.github.io/tutorials/data-manipulation/scraping/
"""
学习了这么多实用的方法, 我们接下来就来做一个小实战, 让我们的爬虫在百度百科上自由爬行, 在各个百科网页上跳来跳去.
相关教程
分享到:
如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人.
UnityTutorial没有正式的经济来源, 如果你也想支持 UnityTutorial 并看到更好的教学内容, 赞助他一点点, 作为鼓励他继续开源的动力.