Извлечение со стола содержимого красивого супа - PullRequest
0 голосов
/ 21 марта 2019

Я пытался извлечь содержимое из таблицы на веб-сайте.

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'

1 Ответ

0 голосов
/ 21 марта 2019

Вы можете использовать только запросы.Вы можете отфильтровать свои значения, выполнив сопоставление строк с ожидаемыми значениями для определенных атрибутов класса при циклическом переносе строк таблицы.Я установил две представляющие интерес таблицы в отдельные переменные, которые представляют собой списки строк в этих таблицах.Каждая из таблиц на странице имеет свой собственный отдельный идентификатор класса для номера таблицы, например, 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...