tags: #正则表达式 #HTML提取
.*
[\s\S]*
(.*?)
<a href=‘http://www.cnblogs.com/buchiany/‘>不迟any</a>
匹配的正则表达式:<a.*?>(.*?)<\/a>
[\s]*
使用情况举例,匹配下面HTML内容里第一行<tr>
和第三行<th>
,之间跨越了空白HTML:
要匹配的内容第一部分<tr> <th>要匹配的内容第二部分
匹配的正则表达式:<tr>[\s]*<th>
抓取古诗案例
# -*- coding:utf-8 -*- import re import requests def crawl(start_url): base_url = ‘http://so.gushiwen.org‘ req_headers = {‘User-Agent‘: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘} for i in range(1, 126): restart_url = start_url + str(i) + ‘.aspx‘ print(restart_url) res = requests.get(restart_url, headers=req_headers) if res.status_code == requests.codes.ok: html = res.text # 获取所有诗的链接 parttern_href = re.compile(r‘<div class="cont">.*?<p><a .*? href="(.*?)" .*?>.*?</p>‘, flags=re.DOTALL) # 标红的部分为捕获 将会直接返回 hrefs = re.findall(parttern_href, html) # 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。 # 获取每一首诗的内容,并保存到本地 with open(‘李白诗集.txt‘, mode=‘a‘, encoding=‘utf-8‘) as f: for href in hrefs: res = requests.get(base_url + href, headers=req_headers) if res.status_code == requests.codes.ok: # 标题 parttern_title = re.compile(r‘<div class="cont">.*?<h1 .*?>(.*?)</h1>‘, re.DOTALL) # 标红的部分为捕获 将会直接返回 title = re.search(parttern_title, res.text).group(1) # 内容 parttern_content = re.compile(r‘<div class="cont">.*?<div class="contson" id=".*?">(.*?)</div>‘,re.DOTALL) # 标红的部分为捕获 将会直接返回 content = re.search(parttern_content, html).group(1) # 扫描整个字符串并返回第一个成功的匹配。 content = re.sub(r‘<br />‘, ‘\n‘, content) # 用于替换字符串中的匹配项 content = re.sub(r‘<p>‘, ‘‘, content) content = re.sub(r‘</p>‘, ‘‘, content) print(‘正在获取 {title}‘.format(title=title)) f.write(‘{title}{content}\n‘.format(title=title, content=content)) if __name__ == ‘__main__‘: start_url = ‘https://so.gushiwen.org/authors/authorvsw_b90660e3e492A‘ crawl(start_url)
原文:https://www.cnblogs.com/luweiweicode/p/14335573.html