如何使用Beautiful Soup从Script标签的articleBody内容中提取目标URL
提取articleBody中的iframe URL
嘿,针对你遇到的这个问题,其实有几种靠谱的解决方案,咱们一个个来看:
方法一:正则表达式(灵活通用)
既然你已经考虑过正则,这确实是个很适合的方案,因为目标URL的格式很固定——紧跟在#iframe: 之后,直到第一个(结束。咱们可以写一个精准的正则来匹配:
import re import json from bs4 import BeautifulSoup # 假设你已经拿到了soup对象 script_content = soup.find('script', type='application/ld+json').text data = json.loads(script_content) article_body = data['articleBody'] # 匹配URL url_match = re.search(r'#iframe: (https?://[^)]+)', article_body) if url_match: target_url = url_match.group(1) print(target_url) # 输出结果:https://audm.herokuapp.com/player-embed?pub=newyorker&articleID=60db43bb53829a9732660612
这个正则的逻辑很清晰:
https?://:匹配以http或https开头的URL[^)]+:匹配所有不是右括号的字符,刚好能截取到URL的结尾(因为后面就是(100%x90))
方法二:字符串分割(简单直观)
如果你的目标格式完全固定(不会有其他变种),直接用字符串分割会更简单,不需要依赖正则库:
import json from bs4 import BeautifulSoup script_content = soup.find('script', type='application/ld+json').text data = json.loads(script_content) article_body = data['articleBody'] # 分步分割提取 if '#iframe: ' in article_body: # 先分割出#iframe:后面的内容 post_iframe_part = article_body.split('#iframe: ')[1] # 再分割出(前面的内容,就是目标URL target_url = post_iframe_part.split('(')[0].strip() print(target_url)
这种方法的优点是代码可读性高,新手也能一眼看懂,而且对于固定格式的文本处理性能略优(虽然这个场景下差异可以忽略)。
怎么选?
- 如果以后可能遇到格式小变化(比如URL前后有空格、或者
#iframe:后面有空格),正则更灵活,稍微调整表达式就能适配; - 如果格式永远不会变,字符串分割更直接,代码更简洁。
不管用哪种方法,记得加个判断(比如if url_match或者if '#iframe: ' in article_body),避免因为页面结构变化导致代码报错~
内容的提问来源于stack exchange,提问作者JetJaguar124
相关产品推荐
相关产品推荐

