You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:34:58