BeautifulSoup Python Извлечение заголовка тега для определенных тегов с атрибутом

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

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

Вот часть моего кода

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 = = with-date «поскольку это только заголовок для дат на странице, почему я не просто хватаю все ли».

Всего 2 ответа


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


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

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

Есть идеи?

10000