Сначала выберите якорь с помощью HREF, а затем найти шесть предыдущих ТД:
from bs4 import BeautifulSoup
import requests
url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm'
soup = BeautifulSoup(requests.get(url).content,"html.parser")
anchor = soup.select_one("a[href=./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W]")
data = [td.text for td in anchor.find_all_previous("td","DataB", limit=6)]
Если запустить код, вы можете увидеть, мы получаем текст из предыдущих шесть ТДА:
In [1]: from bs4 import BeautifulSoup
...: import requests
...: url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm'
...: soup = BeautifulSoup(requests.get(url).content,"html.parser")
...: anchor = soup.select_one("a[href=./hist/LeafHandler.ashx?n=PET&s=W_EPOOX
...: E_YIR_NUS_MBBLD&f=W]")
...: data = [td.text for td in anchor.find_all_previous("td","DataB", limit=6
...:)]
...:
In [2]: data
Out[2]: ['934', '919', '957', '951', '928', '139']
Это не совсем так, как есть два разных класса для td's Current2 и DataB sdo мы можем использовать родителя анкер, который будет сам по себе:
In [5]: from bs4 import BeautifulSoup
...: import requests
...: url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm'
...: soup = BeautifulSoup(requests.get(url).content,"html.parser")
...: anchor_td = soup.find("a", href="./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_Y
...: IR_NUS_MBBLD&f=W").parent
...: data = [td.text for td in anchor_td.find_all_previous("td", limit=6)]
...:
In [6]: data
Out[6]: ['936', '934', '919', '957', '951', '928']
Теперь мы получаем именно то, что хотим.
Наконец, мы могли бы получить прародителя из якоря т.е. основной тд затем использовать отборное, используя оба названия класса в нашем выберите:
href = "./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W"
grandparent = soup.find("a", href=href).parent.parent
data = [td.text for td in grandparent.select("td.Current2,td.DataB")]
Опять данные дают нас тот же выход.
похоже, что вы можете получить данные страницы в формате .xls http://www.eia.gov/dnav/pet/xls/PET_SUM_SNDW_DCUS_NUS_W.xls может быть проще проанализировать это? – Mono
Спасибо. Я видел это, но было просто любопытно, если кто-то попробовал что-то подобное в Python. – judabomber
вы также можете [анализировать .xls в python] (http: // stackoverflow.ком/вопросы/2942889/чтение-синтаксический-Excel-XLS-файлов-с-питон). Однако, если вы хотите сделать это с помощью BeautifulSoup .. Я предполагаю, что вы пытаетесь извлечь все данные из таблицы html? или это просто строка, связанная с этим конкретным href? – Mono