正则处理BeautifulSoup列表遇TypeError,求提取链接数字生成新链接方案
解决Python爬虫提取赛事分析链接的TypeError问题
嘿,我看到你被这个TypeError困扰多日了,咱们来一步步搞定它~
错误根源
你代码里的re.search(r"\((.......\))",element)这行出了问题:这里的element是BeautifulSoup返回的<a>标签对象,而不是字符串类型。re.search()只能处理字符串或字节对象,所以才会抛出TypeError: expected string or bytes-like object。
修正方案
我们需要先从标签里取出包含javascript:analysis(XXXXXXX)的href属性值,再用正则提取数字,最后拼接成目标链接。下面是修正后的完整代码:
import bs4 as bs import sys import re from PyQt5.QtWebEngineWidgets import QWebEnginePage from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QUrl class Page(QWebEnginePage): def __init__(self, url): self.app = QApplication(sys.argv) QWebEnginePage.__init__(self) self.html = '' self.loadFinished.connect(self._on_load_finished) self.load(QUrl(url)) self.app.exec_() def _on_load_finished(self): self.html = self.toHtml(self.Callable) print('READY!') def Callable(self, html_str): self.html = html_str self.app.quit() def main(): page = Page('http://www.nowgoal.cc/') soup = bs.BeautifulSoup(page.html, 'html.parser') analysis_links = [] # 存储最终生成的分析页面链接 # 遍历所有带赛事分析标识的a标签 for a_tag in soup.find_all("a", attrs={'title' : 'Match analyze'}): # 提取a标签的href属性值(这才是包含javascript代码的字符串) href_content = a_tag.get('href') if href_content: # 用正则精准提取analysis()括号内的数字 match_result = re.search(r"analysis\((\d+)\)", href_content) if match_result: match_id = match_result.group(1) # 拼接成直接访问的分析页面URL full_link = f"http://www.nowgoal.cc/analysis/{match_id}.html" analysis_links.append(full_link) # 输出所有生成的链接 print("生成的赛事分析直接链接列表:") for link in analysis_links: print(link) if __name__ == '__main__': main()
关键修正点
- 获取正确的字符串源:用
a_tag.get('href')拿到实际的javascript代码字符串,而不是直接操作Tag对象 - 优化正则表达式:
r"analysis\((\d+)\)"专门匹配analysis(数字)的格式,\d+可以适配任意长度的数字,比固定7位的匹配更灵活 - 结构化存储结果:把生成的链接存入列表,方便后续批量使用
运行这段代码后,就能成功提取所有赛事的分析页面直接链接,不会再抛出类型错误啦~
内容的提问来源于stack exchange,提问作者Mad Mike
相关产品推荐
相关产品推荐

