Python Beautifulsoup таблица тд элемент - PullRequest
1 голос
/ 30 сентября 2019

Я могу получить данные из таблицы HTML, но как мне получить только те данные, которые мне нужны? Например, как бы я прочитал только «10 или более см (16+ км)»? Строка 7?

KBWI (Baltimore-Washington, MD, US)
KBWI 301254Z 10007KT 10SM SCT017 BKN023 OVC039 21/18 A3027 RMK AO2 SLP249 T02060178
20.6°C ( 69°F)
17.8°C ( 64°F) [RH =  84%]
30.27 inches Hg (1025.1 mb) [Sea level pressure: 1024.9 mb]
from the E (100 degrees) at   8 MPH (7 knots;  3.6 m/s)
10 or more sm (16+ km)
2300 feet AGL
scattered clouds at 1700 feet AGL, broken clouds at 2300 feet AGL, overcast cloud deck at 3900 feet AGL

page = urlopen(metar_link)
soup = BeautifulSoup(page, 'html.parser')
table = soup.find('table')

for tr in table.find_all('tr'):
    metar = tr.find_all('td')[1].text.strip()
    print(metar)

Ответы [ 4 ]

1 голос
/ 30 сентября 2019

Я предполагаю, что вам нужны данные после Visibility span.

Так что вы можете сделать что-то вроде этого:

import requests
from bs4 import BeautifulSoup as soup

url = "https://www.aviationweather.gov/metar/data?ids=kbwi&format=decoded&date=&hours=0"
resp = requests.get(url)

page = soup(resp.text, 'html.parser')

table = page.find('table')
activate_print = ['Visibility:']

save_flag = False
for td in table.find_all('td'):
    if save_flag:
        print(td.text)
        save_flag = False
    if td.find('span') and td.find('span').text in activate_print:
        save_flag = True

результат:

10 or more sm (16+ km)

Конечно, если вы хотите что-то еще, вам просто нужно сделать ту же логику и добавить тег в список activate_print

1 голос
/ 30 сентября 2019

Вы также можете прочитать его в массив данных (поскольку это тег <table>) и отфильтровать таким образом.

import pandas as pd

url = "https://www.aviationweather.gov/metar/data?ids=kbwi&format=decoded&date=&hours=0"

df = pd.read_html(url)[0]
df[df[0] == 'Visibility:'][1]
0 голосов
/ 30 сентября 2019

Краткий путь с использованием bs4 4.7.1+: содержит и соседний братский комбинатор

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.aviationweather.gov/metar/data?ids=kbwi&format=decoded&date=&hours=0')
soup = bs(r.content, 'lxml')
print(soup.select_one('td:contains("Visibility:") + td').text)
0 голосов
/ 30 сентября 2019

Попробуйте это только с тегом td.

print(table.find_all('td')[13].text.strip())

Код:

page = urlopen(metar_link)
soup = BeautifulSoup(page, 'html.parser')
table = soup.find('table')
print(table.find_all('td')[13].text.strip())

Или вы можете найти тег span Visibility, а затем найти следующий тег td.

from bs4 import BeautifulSoup
import requests
page = requests.get("https://www.aviationweather.gov/metar/data?ids=kbwi&format=decoded&date=&hours=0")
soup = BeautifulSoup(page.text, 'html.parser')
table = soup.find('table')
print(table.find('span',text='Visibility:').find_next('td').text.strip())

Выход:

10 or more sm (16+ km)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...