从表美汤中提取内容
Posted
技术标签:
【中文标题】从表美汤中提取内容【英文标题】:Extracting contents from the table beautiful soup 【发布时间】:2019-08-12 18:19:33 【问题描述】:我一直在尝试提取网站上表格中的内容。
descriptions = []
sources = []
values = []
site = 'https://www.eia.gov/todayinenergy/prices.php' #address of the site
driver = webdriver.Chrome(executable_path=r"chromedriver.exe")
driver.execute_script("document.body.style.zoom='100%'")
driver.get(site)
soup_1 = bs(driver.page_source, 'lxml') #clean up the site using beautiful soup
tables = soup_1.find_all('tbody') #script of interest
print(len(tables)) #count the scripts
for table in tables:
rows = table.find_all('tr')
print(len(rows))
for row in rows:
description = row.find('td', class_='s1')
descriptions.append(descri_clean)
source = row.find('td', class_='s2')
sources.append(source_clean)
value = row.find('td', class_='d1') #find the row that gives the data
values.append(value_clean) #compile it all together
driver.close()
我一直在尝试从表格中获取干净的文本,但是提取的数据看起来像这样。
<td class="s1" rowspan="3">Crude Oil<br/> ($/barrel)</td>
虽然我想要类似“原油($/桶)”之类的东西
当我尝试时
description = row.find('td', class_='s1').text.renderContents()
descriptions.append(descri_clean)
错误出现了
AttributeError: 'NoneType' object has no attribute 'renderContents'
【问题讨论】:
可以提供网址吗? @QHarr 我已经更新了链接。 你想要所有的表? 不是所有我只想要一些但我不知道如何只提取其中一些。 你想要哪些? 【参考方案1】:您可以只使用请求。在循环表行时,您可以通过对某些类属性的预期值进行字符串匹配来过滤掉您的值。我将两个感兴趣的表设置为单独的变量,这些变量是这些表中行的列表。页面上的每个表格都有自己独特的类别标识符,用于表格编号,例如t1,t2 ......
from bs4 import BeautifulSoup as bs
import requests
r = requests.get('https://www.eia.gov/todayinenergy/prices.php')
soup = bs(r.content, 'lxml')
table1 = soup.select('.t1 tr')
table2 = soup.select('.t2 tr')
for item in table1:
if 'Crude Oil ($/barrel) - Nymex Apr' in item.text:
rowInfo = [td.text for td in item.select('td')]
print(rowInfo)
elif 'Ethanol ($/gallon) - CBOT Apr' in item.text:
rowInfo = [td.text for td in item.select('td')]
print(rowInfo)
for item in table2:
if len(item.select('td')) == 4:
header = item.select_one('td.s1').text
if item.select_one('td.s2'):
if item.select_one('td.s2').text in ['WTI','Brent','Louisiana Light','Los Angeles'] and header in ['Crude Oil ($/barrel)','Gasoline (RBOB) ($/gallon)']:
rowInfo = [td.text for td in item.select('td')]
print(rowInfo)
【讨论】:
此代码有效,但我想将其保存在 csv 文件中,是否只是更改打印行信息并将其放入空列表中? @QHarr 是的。追加到列表,转换为 df 并使用 df.to_csv 请考虑接受答案。见how accepting an answer works 和What should I do when someone answers my question?以上是关于从表美汤中提取内容的主要内容,如果未能解决你的问题,请参考以下文章