为何用Beautiful Soup的select('#author')返回空列表,而span#author可行?
这大概率是因为你创建BeautifulSoup对象时使用了XML解析器(比如'xml'),而非HTML解析器(比如'html.parser'、'lxml'或'html5lib')。
具体原因:
- 在HTML规范里,
id属性是具有特殊语义的唯一标识符,CSS选择器#author就是专门匹配带有id="author"的HTML元素的规则。 - 但XML解析器不会把
id属性当作特殊属性处理,它只会将其视为普通的元素属性。此时,#author这种依赖HTML语义的CSS选择器就无法被解析器识别,自然返回空列表。 - 而
span#author这种写法,本质是标签选择器 + 属性选择器的组合(等价于span[id="author"]),XML解析器可以识别这种基于标签和属性的匹配逻辑,所以能正确定位到目标元素。
验证与解决:
先检查你创建BeautifulSoup对象的代码,如果是类似这样的:
exampleSoup = BeautifulSoup(html_content, 'xml')
改成使用HTML解析器即可:
# 推荐用lxml或html5lib,兼容性更强 exampleSoup = BeautifulSoup(html_content, 'lxml') # 或者用Python内置的解析器 exampleSoup = BeautifulSoup(html_content, 'html.parser')
修改后再调用exampleSoup.select('#author'),就能正常返回目标元素了。
另外,也有可能是你使用的BeautifulSoup版本过于老旧(比如低于4.4.0),旧版本对CSS选择器的支持存在缺陷。建议升级到最新版本:
pip install --upgrade beautifulsoup4
内容的提问来源于stack exchange,提问作者Todd Burus
相关产品推荐
相关产品推荐

