首页 > 解决方案 > 如何在python中使用beautifulsoup(或其他)从rvest(来自R)模拟html_nodes

问题描述

我有这个 R 脚本,我正试图在 python 中重新制作。

在 R 中,我正在使用rvest包,但我很难在bs4

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 做同样的事情。

如果我做:

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]

我可以得到url_list非常相似的语法。如果我这样做,我可以破解url_list_raw得到:file_list

file_list=[x.parent.parent.parent.find('td').text for x in url_list_raw]

使用这个三元组parent感觉很笨拙,并且可能会因网站的微小变化而刹车。有没有更好的方法来做到这一点?

标签: pythonbeautifulsoup

解决方案


您的第二个等效版本是在您的列表理解中继续使用 css 类选择器,就像 rvest 一样;这将通过select()bs4 的方法应用。然后,您将需要.text每个节点的属性。

 file_list = [i.text for i in fp.select('.labelOptional_ind')]

推荐阅读