Python如何爬取以引号/连字符开头且包含指定人名的引语文本
特定人物引语提取方案优化
原有代码问题
- 绑定了单站点专属CSS类
dcr-s23rjr,无法适配多站点批量爬取场景 - 没有做引语格式校验,只要包含目标人名就返回,会混入大量非引语文本
- 循环内重复调用
soup.find属于冗余操作,执行效率低
实现逻辑
要同时满足两个筛选规则:
- 文本去除首尾空白后,以双引号
"或者连字符-开头 - 文本包含指定的目标人名
优化后代码
import requests from bs4 import BeautifulSoup def extract_target_quotes(page_url, target_name_list): # 发起页面请求,添加UA伪装避免反爬拦截 resp = requests.get(page_url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"}) if resp.status_code != 200: return [] soup = BeautifulSoup(resp.text, "html.parser") valid_quotes = [] # 遍历所有段落标签,可按需扩展<q> <blockquote>等引语专属标签 for tag in soup.find_all("p"): text = tag.get_text(strip=True) # 跳过空文本避免索引报错 if not text: continue # 同时满足开头格式要求+包含目标人名才保留 if text.startswith(('"', '-')) and any(name in text for name in target_name_list): valid_quotes.append(text) return valid_quotes # 调用示例 if __name__ == "__main__": test_url = "https://www.theguardian.com/us-news/2021/oct/17/jeffrey-clark-scrutiny-trump-election-subversion-scheme" # 可自行添加需要匹配的人名 target_names = ["Michael Bromwich", "John Johnson"] result = extract_target_quotes(test_url, target_names) for quote in result: print(quote)
可选扩展优化
- 兼容全角符号场景:如果爬取的中文站点存在全角双引号
“、全角破折号—作为引语开头的情况,将startswith的参数修改为('"', '-', '“', '—')即可 - 覆盖更多引语标签:部分站点会用
<q>或者<blockquote>标签包裹引语,将soup.find_all("p")修改为soup.find_all(["p", "q", "blockquote"])即可覆盖这类场景 - 批量爬取优化:多页面爬取时建议添加1-3秒的请求间隔,避免触发站点反爬规则
内容的提问来源于stack exchange,提问作者Tobias Simonsen
相关产品推荐
相关产品推荐

