2016-07-28 2 views
1

Shell screen shotBeautiful Soup Tree назад Навигация

Здравствуйте:

Я неофит Python так Извинения заранее, если этот вопрос слишком легко. Я искал как сумасшедший для ответа, но не могу найти пример, применимый к моему делу.

В Python 3 running Beautiful Soup, я пытаюсь установить ссылку на html tree как конкретный href, а затем очистить 6 предыдущих числовых значений от url ниже.

url = 'http://www.eia.gov/dnav/pet/pet_sum_sndw_dcus_nus_w.htm' 

Моя причина, начиная с href тега является то, что это единственная ссылка в HTML, который остается такой же и не повторяется снова.

В моем примере, я хотел бы начать с href тегом:

href="./hist/LeafHandler.ashx?n=PET&s=W_EPOOXE_YIR_NUS_MBBLD&f=W" 

Затем усиками отдельного содержимого из шести "td=class" тегов предыдущих этого тега:

936, 934, 919,957, 951, 928. 

Спасибо заранее за любая помощь.

+0

похоже, что вы можете получить данные страницы в формате .xls http://www.eia.gov/dnav/pet/xls/PET_SUM_SNDW_DCUS_NUS_W.xls может быть проще проанализировать это? – Mono

+0

Спасибо. Я видел это, но было просто любопытно, если кто-то попробовал что-то подобное в Python. – judabomber

+0

вы также можете [анализировать .xls в python] (http: // stackoverflow.ком/вопросы/2942889/чтение-синтаксический-Excel-XLS-файлов-с-питон). Однако, если вы хотите сделать это с помощью BeautifulSoup .. Я предполагаю, что вы пытаетесь извлечь все данные из таблицы html? или это просто строка, связанная с этим конкретным href? – Mono

ответ

0

Формат файла - это количество таблиц, которые вы заинтересованы в том, чтобы быть вторым. Поскольку вы знаете значение атрибута href, с которым вы хотите согласовать, один из способов доступа к частям, которые вам нужны, - это перебирать строки таблицы, прежде всего, значение href - это тот, который вы хотите.

0

Сначала выберите якорь с помощью 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")] 

Опять данные дают нас тот же выход.

+0

Спасибо миллиону джентльменов, я очень ценю это. – judabomber