使用BeautifulSoup4爬取链接时处理无<a href>标签的异常问题
解决Bs4爬取时部分元素无标签的TypeError问题
这个问题我之前也碰到过!核心问题在于你直接判断tds.a['href']的时候,如果tds.a本身就是None(也就是当前td里没有标签),这时候访问下标['href']就会直接抛出TypeError,根本走不到else分支。下面给你几种可行的解决办法:
方法一:先判断标签是否存在
最直接的修复方式是先检查tds.a是否非空,再去获取href属性:
base_url = "http://example.com" abc = base_url + tds.a['href'] if tds.a else tds.text.strip()
这里的逻辑是:如果当前td里存在标签(tds.a不为None),就拼接完整URL;否则就提取td的文本内容(用strip()是为了去除文本前后多余的空格和换行)。
方法二:用get()方法增强健壮性
如果遇到标签存在但没有href属性的极端情况,上面的方法还是会报错。这时候可以用Bs4元素的get()方法,它在属性不存在时会返回None,不会抛出异常:
base_url = "http://example.com" if tds.a: href = tds.a.get('href') abc = base_url + href if href else tds.text.strip() else: abc = tds.text.strip()
也可以写成更简洁的三元表达式:
abc = base_url + tds.a.get('href') if tds.a and tds.a.get('href') else tds.text.strip()
方法三:用try-except捕获异常
如果你的爬取场景里有更多不可预见的异常情况(比如标签嵌套结构异常),可以用异常捕获的方式处理:
base_url = "http://example.com" try: abc = base_url + tds.a['href'] except (AttributeError, KeyError): # AttributeError对应tds.a为None的情况,KeyError对应a标签无href属性的情况 abc = tds.text.strip()
针对你给出的示例td元素,以上方法都会正确提取到[VIEW COVENANT]对应的链接;当遇到没有标签的td时,会自动提取该td的文本内容。
内容的提问来源于stack exchange,提问作者Sriram Arvind Lakshmanakumar
相关产品推荐
相关产品推荐

