从表美汤中提取内容

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?

以上是关于从表美汤中提取内容的主要内容,如果未能解决你的问题,请参考以下文章

在汤中找到第一个链接找到[重复]

美丽汤中的提取链接[重复]

从 <a> 美丽的汤中提取 href

excel中怎样在一个表中提取另一个表对应的数据?

从PDF python中提取/识别表[关闭]

从表中获取全部内容