如何让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
相关产品推荐
相关产品推荐

