在从网站资源中抓取和分析内容时,你经常需要提取某个页面包含的所有链接。在本章中,我们将找出如何从 HTML 文档中提取链接。
HTML 使用 <a>
标签来插入超链接。锚点标签的 href
属性允许你建立链接。它使用如下语法:
<a href="网页URL">超链接文本</a>
通过 find_all()
方法,我们可以收集文档中的所有锚点标签,然后打印每个标签的 href
属性的值。
在下面的例子中,我们提取了 Google 主页上的所有链接。我们使用 requests
库来收集 https://google.com
的 HTML 内容,将其解析成一个 soup
对象,然后收集所有的 <a>
标签。最后,我们打印出 href
属性。
示例
from bs4 import BeautifulSoup
import requests
url = "https://www.google.com/"
req = requests.get(url)
soup = BeautifulSoup(req.content, "html.parser")
tags = soup.find_all('a')
links = [tag['href'] for tag in tags]
for link in links:
print(link)
以下是上述程序运行时的部分输出:
https://www.google.co.in/imghp?hl=en&tab=wi
https://maps.google.co.in/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?tab=w1
https://news.google.com/?tab=wn
https://mail.google.com/mail/?tab=wm
https://drive.google.com/?tab=wo
https://www.google.co.in/intl/en/about/products?tab=wh
http://www.google.co.in/history/optout?hl=en
/preferences?hl=en
https://accounts.google.com/ServiceLogin?hl=en&passive=true&continue=https://www.google.com/&ec=GAZAAQ
/advanced_search?hl=en-IN&authuser=0
https://www.google.com/url?q=https://io.google/2023/%3Futm_source%3Dgoogle-hpp%26utm_medium%3Dembedded_marketing%26utm_campaign%3Dhpp_watch_live%26utm_content%3D&source=hpp&id=19035434&ct=3&usg=AOvVaw0qzqTkP5AEv87NM-MUDd_u&sa=X&ved=0ahUKEwiPzpjku-z-AhU1qJUCHVmqDJoQ8IcBCAU
然而,HTML 文档可能包含不同协议方案的超链接,例如用于电子邮件地址的 mailto:
协议,用于电话号码的 tel:
方案,或者使用 file://
URL 方案链接到本地文件。在这种情况下,如果我们只对提取带有 https://
方案的链接感兴趣,可以通过下面的例子实现。我们有一个 HTML 文档,其中包含不同类型超链接,只有那些带有 https://
前缀的链接被提取出来。
<p><a href="https://www.yoagoa.com">网页链接 </a></p>
<p><a href="https://www.example.com">网页链接 </a></p>
<p><a href="mailto:nowhere@mozilla.org">电子邮件链接</a></p>
<p><a href="tel:+4733378901">电话链接</a></p>
示例
from bs4 import BeautifulSoup
import requests
html = '''
<p><a href="https://www.yoagoa.com">网页链接 </a></p>
<p><a href="https://www.example.com">网页链接 </a></p>
<p><a href="mailto:nowhere@mozilla.org">电子邮件链接</a></p>
<p><a href="tel:+4733378901">电话链接</a></p>
'''
soup = BeautifulSoup(html, "html.parser")
tags = soup.find_all('a')
links = [tag['href'] for tag in tags]
for link in links:
if link.startswith("https"):
print(link)
输出
https://www.yoagoa.com
https://www.example.com