Очистка веб-страниц Ср

#python #beautifulsoup

Вопрос:

Пытаюсь изучить веб-скребок с помощью bs4 и испытываю небольшие проблемы с определением даты недели.

Это то, что у меня есть в настоящее время:

 import requests
from bs4 import BeautifulSoup
import pandas as pd

page = requests.get('https://weather.gc.ca/city/pages/bc-74_metric_e.html')
html = BeautifulSoup(page.content, 'html.parser')

forecast = html.find(class_="visible-xs mrgn-tp-md")

print(forecast.find_all("strong"))
 

Я хотел бы получить следующие результаты:

 Tonight
Wed
Thu
Fri
Sat
Sun
Mon
 

Ответ №1:

Здесь (проверено в python 3):

  counter = 0
 for i in forecast.find_all("strong"):
     if counter == 0:
             print(i.text)
     elif i.find("abbr"):
             print(i.text.split(',')[0])
     counter=1
 

Или, если вы хотите избавиться от ветвления:

  strong_contents = forecast.find_all("strong")
 values = []
 # first element is Tonight without "abbr" 
 values.append(strong_contents[0].text)
 # Use list slicing to get the rest of the elements and filter by "abbr"
 for i in strong_contents[1:]:
     if i.find("abbr"):
             # i.text gives "Wed, 6 Oct", so we split by `,` 
             # and print first element
             values.append(i.text.split(',')[0])
 print('n'.join(values))

 

Ответ №2:

Вы можете попробовать этот метод

 strong_tag = forecast.find_all("strong")

days = [strong_tag[0].contents[0]]

for i in strong_tag:
    if i.find("abbr"):
        days.append(i.getText())
 

Если мы напечатаем days список, результат будет выглядеть так:

 print("n".join(days))
 

выход:

 Tonight
Wed, 6 Oct
Thu, 7 Oct
Fri, 8 Oct
Sat, 9 Oct
Sun, 10 Oct
Mon, 11 Oct
 

Если вам нужны только названия дней, вы можете использовать days.append(i.getText().split(",")[0]) вместо days.append(i.getText()) .

Ответ №3:

Я новичок, я действительно пытался выяснить ваш ожидаемый результат. Если я совершу какую-либо ошибку, пожалуйста, исправьте меня. Вы можете попробовать приведенный ниже код, чтобы получить результат. Я надеюсь, что это будет полезно для вас.

 import requests
from bs4 import BeautifulSoup
import pandas as pd

page = requests.get('https://weather.gc.ca/city/pages/bc-74_metric_e.html')
html = BeautifulSoup(page.content, 'html.parser')

forecast = html.find(class_="visible-xs mrgn-tp-md")

data = forecast.find_all("strong")

store = []

for i in data:
    store.append(i.get_text())
    
# print(store)
    
keyword = ['Tonight', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue']

for i in store:
    for j in keyword:
        if str(j) in str(i):
            print(i.split(',',1)[0])
 

Выход:

 Tonight
Wed
Thu
Fri
Sat
Sun
Mon
 

И чтобы получить результат ниже:

 Tonight
Wed, 6 Oct
Thu, 7 Oct
Fri, 8 Oct
Sat, 9 Oct
Sun, 10 Oct
Mon, 11 Oct
 

Тебе нужно немного измениться print(i) вместо того, чтобы print(i.split(',',1)[0])

Комментарии:

1. Спасибо за идею! Я должен был уточнить в вашей статье, что я пытался избежать создания списка, подобного списку ключевых слов. Я думаю, что моей первой ошибкой при создании моего веб-скребка было то, что я не использовал класс «сильный», чтобы сузить круг того, что мне нужно.

Ответ №4:

Альтернативный выбор

Выберите <table> , который содержит class имя textforcast и все его <strong> :

 forecast = html.select('table.textforecast strong')
 

Выберите аббревиатуру дня недели, включая сегодняшний вечер, в качестве списка

 [x.get_text().split(',')[0] for x in forecast]
 

Список выходных данных:

 ['Tonight', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon']
 

Выводите только значения:

 print(*[x.get_text().split(',')[0] for x in forecast], sep = "n")

Tonight
Wed
Thu
Fri
Sat
Sun
Mon
 

Выберите даты в списке

 [' '.join(x.get_text().split('xa0')) for x in forecast]
 

Список выходных данных:

 ['Tonight',
 'Wed, 6 Oct',
 'Thu, 7 Oct',
 'Fri, 8 Oct',
 'Sat, 9 Oct',
 'Sun, 10 Oct',
 'Mon, 11 Oct']
 

Выводите только значения:

 print(*[' '.join(x.get_text().split('xa0')) for x in forecast] for x in forecast], sep = "n")

Tonight
Wed, 6 Oct
Thu, 7 Oct
Fri, 8 Oct
Sat, 9 Oct
Sun, 10 Oct
Mon, 11 Oct
 

Полный пример

 import requests
from bs4 import BeautifulSoup
import pandas as pd

page = requests.get('https://weather.gc.ca/city/pages/bc-74_metric_e.html')
html = BeautifulSoup(page.content, 'html.parser')

forecast = html.select('table.textforecast strong')

print(*[x.get_text().split(',')[0] for x in forecast], sep = "n")
 

Выход

 Tonight
Wed
Thu
Fri
Sat
Sun
Mon