如何用BeautifulSoup解析<pre>标签数据及爬取指定URL返回空的原因
问题1:如何使用BeautifulSoup解析
标签中的数据?
标签一般用来存放预格式化文本(比如代码片段、JSON数据、日志内容等),用BeautifulSoup解析它其实非常直观,我给你拆解步骤并附上示例: - 第一步:用requests库获取目标页面的内容 - 第二步:用BeautifulSoup解析整个页面 - 第三步:定位到标签(用`find()`找单个标签,`find_all()`找多个) - 第四步:提取标签内的文本,要是里面是结构化数据(比如JSON),还能进一步转换为可操作的对象 示例代码: ```python import requests from bs4 import BeautifulSoup import json # 替换成你的目标URL target_url = "https://example.com/page-with-pre-tag" response = requests.get(target_url) soup = BeautifulSoup(response.text, "lxml") # 定位第一个标签 pre_element = soup.find("pre") if pre_element: # 获取标签内的完整文本(strip=False保留原始格式) raw_pre_text = pre_element.get_text(strip=False) print("原始预格式化文本:") print(raw_pre_text) # 如果内容是JSON格式,可解析为字典 try: structured_data = json.loads(raw_pre_text) print("\n解析后的JSON数据:") print(structured_data) except json.JSONDecodeError: print("\n标签内的内容不是标准JSON格式") ``` --- # 问题2:爬取Bazaarvoice评论页面返回空列表的原因及解决方法 嘿,这个坑我之前也踩过!你请求的这个URL返回的不是纯HTML页面,而是一段**JavaScript代码**——你要找的``元素其实被包裹在JS的变量里,不是直接存在页面的DOM结构中,所以直接用BeautifulSoup解析`r.content`自然找不到任何内容。另外,网站可能还会检查请求头,没模拟浏览器的话可能返回不完整内容。 给你一套可行的解决步骤: 1. 给请求加上模拟浏览器的`User-Agent`请求头,避免被反爬拦截 2. 用正则表达式从返回的JS代码中提取出包含评论的HTML字符串 3. 把这段HTML字符串重新交给BeautifulSoup解析,再查找目标元素 修改后的代码示例: ```python import requests from bs4 import BeautifulSoup import re import json url = "https://bedbathandbeyond.ugc.bazaarvoice.com/2009-en_us/1061083288/reviews.djs?format=embeddedhtml&page=4&scrollToTop=true" # 模拟Chrome浏览器的请求头 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" } response = requests.get(url, headers=headers) # 用正则匹配JS中的评论数据变量 match_result = re.search(r'BV\.reviewsEmbeddedData\s*=\s*({.*?});', response.text, re.DOTALL) if match_result: # 解析JS中的JSON数据 review_data = json.loads(match_result.group(1)) # 提取包含评论的HTML内容 review_html = review_data.get("html", "") # 重新解析这段HTML soup = BeautifulSoup(review_html, "lxml") # 现在就能找到目标元素了 review_abbr_texts = soup.find_all('span', class_='BVRRReviewAbbreviatedText') print(f"成功找到 {len(review_abbr_texts)} 条评论摘要:") for text in review_abbr_texts: print("- " + text.get_text(strip=True)) else: print("未能从返回的JS代码中提取到评论数据,请检查正则表达式是否匹配最新的页面结构") ``` 简单解释下: - `User-Agent`是为了让网站认为请求来自真实浏览器,避免被拦截 - 正则表达式用来从JS代码里抓出存储评论数据的JSON对象,这个对象里的`html`字段就是包含所有评论的HTML片段 - 把这段HTML单独解析后,就能正常用`find_all()`找到你要的元素了 内容的提问来源于stack exchange,提问作者Eric Cai
相关产品推荐
相关产品推荐

