每日推荐 | 正则表达式获取网页 HTML 指定标签内容 - 循环获取社区首页帖子网址与标题

小伙伴们下午好 ~ 感谢阅读 💫 今日推荐

每日推荐 | 正则表达式获取网页 HTML 指定标签内容 - 循环获取社区首页帖子网址与标题

前两天有小伙伴遇到疑问:希望快速获取网页中某个帖子的 url,下面一段代码实现:循环获取社区首页全部帖子的 url 与标题

1. 需求

获取页面所有帖子的“Url”与“标题”信息
每日推荐 | 正则表达式获取网页 HTML 指定标签内容 - 循环获取社区首页帖子网址与标题

2. 分析

2.1 获取页面全部 HTML 信息

通过 requests.get(url) 即可实现;

也可以使用设计器内置的 iie 库(iie.get_html() 方法获取元素的 html 信息,适用 IE 浏览器)

2.2 将 HTML 信息写入文件

由于打印输出的 HTNL 信息为 str 类型,如果直接读行,是逐字遍历;因此我将它写入文件,可以以读行方式进行筛选

2.3 筛选帖子的 Selector 信息

通过“F2 开发者工具”查看到每个帖子的 selector 信息,发现 均以<a class="ft-a-title"开头,故以此作为查找依据

可以根据自己的需求,定位元素的 selector,同理根据规律字符串作为查找依据

每日推荐 | 正则表达式获取网页 HTML 指定标签内容 - 循环获取社区首页帖子网址与标题

代码中: search = '<a class="ft-a-title"'

2.4 输出 Selector,为获取 Url 与标题做准备

主要为了获取 <a ..> < /a> 这个标签;以此获取帖子标题;因此需要将两行内容相加输出

本文参考来源:常用正则表达式爬取网页信息及分析 HTML 标签总结
代码中:line_html = data[line] + data[line+1]

2.5 根据正则表达式获取页面的帖子 URL 与标题信息

核心代码:
        res_tr = r’<a .?>(.?)’
        m_tr =  re.findall(res_tr,html,re.S|re.M)

3. 实现代码

import requests
import re

#获取页面全部HTML信息
res = requests.get('https://support.i-search.com.cn/')
res.encoding = 'utf-8'
html = res.text
#print(html)

#将HTML信息写入文件
f = open(r"C:\Users\melanie\Desktop\web_html.txt",'w+',encoding="utf-8") #w+:以追加方式打开文件
f.write(html)
f.close()

#读取HTML信息
f = open(r"C:\Users\melanie\Desktop\web_html.txt",'r+',encoding="utf-8") #r+:以读写方式打开文件
data = f.readlines() #data是数组类型

count = 0 #初始化计数,计算获取的帖子的数量;也可以最后直接获取数组的长度
url_list = [] #用于存储帖子url
title_list = [] #用于存储帖子标题

search = '<a class="ft-a-title"' #查找条件,见上述分析

#逐行读取HTML信息
for line in range(len(data)):
    if search in data[line]:
        line_html = data[line] + data[line+1] #此句关键,见上述分析
        #print(line_html)

        #正则表达式获取帖子URL
        res_url = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')"  
        link = re.findall(res_url ,  line_html, re.I|re.S|re.M)  
        for url in link:  
            print(url)
            url_list.append(url) #将url加入数组
            
        #正则表达式获取帖子标题
        res = r'<a .*?>(.*?)</a>'
        text=re.findall(res, line_html, re.I|re.S|re.M)  
        for content in text:  
            print(content)
            title_list.append(content) #将标题加入数组
            
        #匹配查找成功,计数+1
        count += 1
    else:
        continue

#最终统计查找的帖子数量
print('当前页共计 '+ str(count) +' 篇帖子')

#打印所有url与标题
print(url_list)
print(title_list)

#最终务必记得关闭文件
f.close()

4. 运行结果

每日推荐 | 正则表达式获取网页 HTML 指定标签内容 - 循环获取社区首页帖子网址与标题

代码可直接拷贝运行;

关于获取页面 HTML 信息其他指定标签的内容,参考源文 常用正则表达式爬取网页信息及分析 HTML 标签总结