You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让lxml将CoinMarketCap两页内容合并到同一解析树?

解决CoinMarketCap多页面解析合并的问题

你遇到的核心问题是**requests.get()并不支持直接传入多个URL作为参数**——第二个位置参数其实是用于设置请求的额外选项(比如headers、timeout等),而不是第二个页面的地址,所以你的写法会导致请求出错,自然无法正确解析第二页内容。

下面是正确的解决方案,我们可以分别请求两个页面,解析各自的DOM树后,把需要的币种数据合并到一起处理:

步骤1:分别请求并解析两个页面

首先,我们单独获取第一页和第二页的HTML内容,再各自转换成lxml的解析树:

from lxml import html
import requests
import datetime
import time

# 定义两个页面的URL
url_page1 = 'https://coinmarketcap.com/'
url_page2 = 'https://coinmarketcap.com/2'

# 可选:添加请求头模拟浏览器,避免被网站反爬拦截
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

# 分别请求两个页面
page1 = requests.get(url_page1, headers=headers)
page2 = requests.get(url_page2, headers=headers)

# 转换成各自的解析树
tree1 = html.fromstring(page1.content)
tree2 = html.fromstring(page2.content)

步骤2:提取并合并币种数据

接下来,用相同的XPath规则分别提取两个页面的币种元素,再合并成一个列表(这里的XPath需要根据你实际要抓取的内容调整,以下是示例):

# 提取第一页的币种行(示例XPath,需根据页面实际结构修改)
coins_page1 = tree1.xpath('//table/tbody/tr')
# 提取第二页的币种行
coins_page2 = tree2.xpath('//table/tbody/tr')

# 合并两个页面的币种数据
all_coins = coins_page1 + coins_page2

步骤3:统一处理所有关注的币种

现在你可以直接遍历all_coins列表,处理你关注的100个币种了,不管它们在第一页还是第二页:

# 假设你的关注币种列表是watchlist
watchlist = ["Bitcoin", "Ethereum", ...]  # 你的100个币种

for coin in all_coins:
    # 提取币种名称(示例XPath,需调整)
    coin_name = coin.xpath('.//td[3]/div/a/text()')[0].strip()
    if coin_name in watchlist:
        # 抓取你需要的价格、涨幅等数据
        price = coin.xpath('.//td[4]/div/a/text()')[0].strip()
        # 后续处理逻辑...
        print(f"{coin_name}: {price}")

额外提示

  • CoinMarketCap的页面结构可能会不定期更新,记得检查你的XPath是否还能正常匹配元素;
  • 可以添加适当的time.sleep()来控制请求频率,避免触发网站的反爬机制;
  • 如果后续需要抓取更多页面(比如前10页),可以把页面请求逻辑封装成函数,循环处理多个URL。

内容的提问来源于stack exchange,提问作者Christopher Batey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:24:41