使用lxml抓取阿森纳队页面球员URL失败:返回空列表求助
解决阿森纳球员URL抓取的问题
嗨,我来帮你搞定这个爬虫问题!你的代码返回空列表主要有两个核心问题:导入语句错误,以及XPath路径太依赖固定DOM层级,很容易失效。咱们一步步来修正:
1. 先修正导入错误
你原代码里的导入语句语法不对,正确的导入应该是这样:
from urllib.request import urlopen import lxml.etree as etree
2. 重构XPath路径(关键!)
原XPath写得太冗长且绑定了固定的div层级(比如div[2]/div[5]),一旦网页布局微调,这个路径就彻底找不到元素了。而且很多时候浏览器会自动给表格补全<tbody>标签,但实际返回的HTML里可能并没有这个标签,这也会导致定位失败。
我们改用更稳健的定位方式:直接定位球员所在的表格,以及包含球员链接的<a>标签。比如找带有squad-table类的表格,然后提取里面球员列的链接:
3. 完整可运行代码
from urllib.request import urlopen import lxml.etree as etree url = "https://www.espn.com/soccer/team/squad/_/id/359/arsenal" # 获取页面HTML内容 response = urlopen(url) html_content = response.read() # 解析HTML tree = etree.HTML(html_content) # 用稳健的XPath提取所有球员的链接标签 player_links = tree.xpath("//table[contains(@class, 'squad-table')]//td[contains(@class, 'player')]/a") # 提取每个链接的href并拼接成完整URL player_urls = [] for link in player_links: href = link.get("href") full_url = f"https://www.espn.com{href}" player_urls.append(full_url) # 打印结果 for url in player_urls: print(url)
为什么这样能行?
- 用
contains(@class, 'squad-table')定位表格,避免依赖固定的完整类名或者DOM层级 - 直接找球员列(
td[contains(@class, 'player')])里的<a>标签,这是球员链接的固定位置,不会轻易变化 - 拼接相对路径为完整URL,方便后续使用
如果运行后还是没结果,可能是页面有动态加载(比如滚动加载更多球员),这时候你可能需要用selenium这类工具来模拟浏览器渲染,但目前这个页面的球员列表是静态加载的,上面的代码应该能正常工作。
内容的提问来源于stack exchange,提问作者Ayden Malekjahani
相关产品推荐
相关产品推荐

