BeautifulSoup调用text属性时find相关代码无输出是什么原因?
问题原因
- 你遇到的无输出问题本质是两个点共同导致的:
requests默认请求的User-Agent是python-requests/版本号,这个WordPress搭建的站点会对默认爬虫UA返回差异化内容:你拿到的第一个<p>标签本身是存在的(所以去掉.text打印标签对象能看到HTML结构),但标签内部要么全是HTML注释、要么嵌套的是脚本/空行占位节点,BeautifulSoup的.text属性不会提取注释、脚本内的非展示文本,最终得到空字符串,打印时自然没有可见内容。- 链式调用没有做节点有效性校验:直接写
.find().p.text的写法,一旦中间节点不符合预期,不会抛错但会拿到空值,很难快速定位问题。
修复方案
按以下步骤调整代码即可:
- 给请求加上浏览器UA,模拟正常用户访问,同时补全编码设置避免文本乱码丢失:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } page = requests.get(url, headers=headers) # 自动识别编码,避免默认编码错误导致文本异常 page.encoding = page.apparent_encoding
- 不要直接用
.p属性取第一个p标签,改为遍历entry-content下所有p标签,过滤掉空内容、注释占位的无效节点,取第一个有实际正文的段落。
完整可运行代码如下:
from bs4 import BeautifulSoup import requests url = 'https://montanahistoriclandscape.com/tag/glasgow-montana/' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } page = requests.get(url, headers=headers) page.encoding = page.apparent_encoding soup = BeautifulSoup(page.text, 'lxml') article = soup.find('article') entry_content = article.find('div', class_='entry-content') first_valid_p = "" # 遍历所有p标签,跳过空内容节点 for p in entry_content.find_all('p'): p_text = p.get_text(strip=True) if p_text: first_valid_p = p_text break print(first_valid_p)
- 调试小技巧:如果后续再遇到类似拿到标签但拿不到文本的问题,先直接打印标签对象的完整
prettify()输出,看内部是不是全是注释、脚本这类非正文内容,针对性跳过即可。
内容的提问来源于stack exchange,提问作者EarlyBirdBuilder
相关产品推荐
相关产品推荐

