BeautifulSoup Python Извлечение названия тега для Specifi c Теги с атрибутом - PullRequest
0 голосов
/ 15 января 2020

Я работаю над скребком, использующим Beautifulsoup, для извлечения информации о концертах для некоторых артистов на songkick. URL, с которым я работаю, находится здесь https://www.songkick.com/metro-areas/17835-us-los-angeles-la/february-2020?page=1. Я смог извлечь всю информацию об артисте, месте проведения, городе и штате, единственное, с чем у меня проблемы - это извлечение даты концертов.

При просмотре элементов html я обратите внимание, что даты показа указаны в виде значений li title = "суббота 01 февраля 2020", например, дети в ul class = "event-листинги". Метод, который я пытался выполнить, заключался в извлечении значений времени и времени, которые вложены в заголовки li, но мои выходные данные включали полную разметку html для каждого времени li времени datetime, а не только datetime. Я ищу либо извлечь названия li или значения времени и времени. У этих li тоже нет класса.

Вот мой код

import requests
from bs4 import BeautifulSoup as bs4

pages=[]
artists=[]
venues=[]
dates=[]
cities=[]
states=[]

pages_to_scrape=1

for i in range(1, pages_to_scrape+1):
    url = 'https://www.songkick.com/metro-areas/17835-us-los-angeles-la/february-2020?page={}'.format(i)
    pages.append(url)
for item in pages:
    page = requests.get(item)
    soup = bs4(page.text, 'html.parser')
    for m in soup.findAll('li', title=True):
        date = m.find('time')
        print(date)

Вывод:

<time datetime="2020-02-01T20:00:00-0800"></time>
<time datetime="2020-02-01T20:00:00-0800"></time>
<time datetime="2020-02-01T19:00:00-0800"></time>
<time datetime="2020-02-01T19:00:00-0800"></time>
<time datetime="2020-02-01T21:00:00-0800"></time>
etc...

Ищем вывод, подобный этому:

2020-02-01
2020-02-01
2020-02-01
etc...

Или, если есть возможность получить значения заголовка li, то как это вывести вот так:

Saturday 01 February 2020
Saturday 01 February 2020
Saturday 01 February 2020
Saturday 01 February 2020
etc...

Мне любопытно, смогу ли я разделить на "для времени, даты и времени , но так как это не текст, я не думаю, что это возможно. Кроме того, я не хочу брать первый li class = "with-date", так как это просто заголовок даты для страницы о том, почему я не только захватывая все ли.

Ответы [ 2 ]

1 голос
/ 15 января 2020

Попробуйте m.find('time')['datetime'] вместо m.find('time')

0 голосов
/ 15 января 2020

Вот способ добиться этого:

import requests
from bs4 import BeautifulSoup
page = requests.get("https://www.songkick.com/metro-areas/17835-us-los-angeles-la/february-2020?page=1")
soup = BeautifulSoup(p.content, "html.parser")
tags = soup.find_all("time")
[t["datetime"].split("T")[0] for t in tags]

Примечания:

  1. Я совершенно уверен, что сканирование Songkick таким образом нарушает их условия.
  2. Вы можете рассмотреть возможность использования их API, который хорошо работает: https://www.songkick.com/developer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...