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

如何用Python的BeautifulSoup实现R语言rvest包的html_nodes功能

R rvest 网页解析逻辑转Python BeautifulSoup 优化实现

原R实现逻辑

myurllist<-"http://mis.ercot.com/misapp/GetReports.do?reportTypeId=12301&reportTitle=Settlement%20Point%20Prices%20at%20Resource%20Nodes,%20Hubs%20and%20Load%20Zones&showHTMLView=&mimicKey"
mylist<-GET(myurllist)
file_list<-mylist %>% read_html %>% html_nodes(".labelOptional_ind") %>% html_text
url_list<-read_html(mylist) %>% html_nodes("a") %>% html_attr('href')

运行上述代码可得到存储实际文件名的file_list,以及存储对应文件下载链接的url_list。

原有Python实现的问题

已有的Python实现可以正常拿到url_list,但为了获取file_list采用了连续调用3次parent的写法,鲁棒性极低,网页结构稍有变动就会失效:

page=requests.get(myurllist)
fp= BeautifulSoup(page.content, 'lxml')
url_list_raw=fp.find_all('a')
url_list=[x['href'] for x in url_list_raw]
# 不规范的实现方式
file_list=[x.parent.parent.parent.find('td').text for x in url_list_raw]

优化实现方案

BeautifulSoup支持和rvest完全等价的CSS选择器语法,直接通过类名筛选对应节点即可,不需要从a标签反向查找父节点,优化后代码如下:

import requests
from bs4 import BeautifulSoup

myurllist = "http://mis.ercot.com/misapp/GetReports.do?reportTypeId=12301&reportTitle=Settlement%20Point%20Prices%20at%20Resource%20Nodes,%20Hubs%20and%20Load%20Zones&showHTMLView=&mimicKey"

page = requests.get(myurllist)
fp = BeautifulSoup(page.content, 'lxml')

# 完全等价于R的html_nodes(".labelOptional_ind") %>% html_text
file_list = [node.text.strip() for node in fp.select(".labelOptional_ind")]
# 完全等价于R的html_nodes("a") %>% html_attr('href')
url_list = [a.get("href") for a in fp.find_all("a")]

这种写法和原R解析逻辑完全对齐,依赖固定的CSS类名做筛选,只要前端节点类名不变,网页结构小范围调整也不会影响解析结果。


内容的提问来源于stack exchange,提问作者Dean MacGregor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:45:07