#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