使用BeautifulSoup抓取包含<a>标签的<p>段落内容的问题
问题解决方法
问题原因
你的代码依赖link.string获取段落文本,但当<p>标签包含<a>这类子标签时,link.string会返回None(因为标签存在多个子节点,无法用单个NavigableString表示),导致判断条件不成立,带超链接的段落被过滤。
解决方案
用get_text()方法替代link.string,该方法能提取标签及其所有子标签内的全部文本内容,同时调整判断逻辑,基于提取后的文本长度筛选有效内容。
修改后的代码
!pip3 install requests pandas from bs4 import BeautifulSoup as BS import requests as req import pandas as pd url = "https://www.geo.tv/latest/456848-ronaldo-eyes-world-cup-quarters-as-morocco-dare-to-dream" webpage = req.get(url) trav = BS(webpage.content, "html.parser") attributes_container = [] for p_tag in trav.find_all('p'): # 获取当前p标签下的所有文本(包含子标签内容),同时去除首尾空白 paragraph_text = p_tag.get_text(strip=True) # 筛选长度超过35的有效段落 if len(paragraph_text) > 35: print(paragraph_text) attributes_container.append(paragraph_text) text_df = pd.DataFrame(attributes_container, columns=["Text"]) text_df
关键改动说明
- 替换文本提取方式:
p_tag.get_text(strip=True)能完整提取标签内所有文本(包括子标签里的内容),strip=True还能清理文本前后的空白字符。 - 简化判断逻辑:移除对
link.string类型的校验,直接基于提取后的文本长度筛选,避免因标签结构导致内容遗漏。 - 补全依赖导入:原代码使用
pd.DataFrame但未导入pandas,这里补上避免运行报错。
内容的提问来源于stack exchange,提问作者M Haider Bin Amir
相关产品推荐
相关产品推荐

