L xml возвращает пустой список - PullRequest
0 голосов
/ 24 марта 2020

Я работаю с l xml, чтобы попытаться получить 10 лучших хитов в настоящее время на spotify (https://spotifycharts.com/regional). Когда я запускаю программу, она возвращает пустой список [] вместо возврата ['song 1', 'song 2' и т. Д.].

    import requests
    import lxml.html

    html = requests.get("https://spotifycharts.com/regional")
    doc = lxml.html.fromstring(html.content)

    songs = doc.xpath('//div[@id="content"]')[0]
    titles = songs.xpath('.//div[@class="chart-table-track"]/text()')
    print(titles)

Я не уверен, была ли это проблема xpath или нет, но когда я перешел на go, поищите другой идентификатор на сайте, его не было. Также id "content" - это то, что содержало текст, который мне был нужен. То же самое для "диаграммы-таблицы-трека". Я не уверен, что я написал неправильный синтаксис или нет, но любая помощь будет признательна.

Спасибо,

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Вы можете попробовать, как показано ниже, чтобы получить первые десять просмотров (rank и name) с этой веб-страницы. Я использовал BeautifulSoup вместо lxml библиотеки для извлечения контента.

import requests
from bs4 import BeautifulSoup

html = requests.get("https://spotifycharts.com/regional")
doc = BeautifulSoup(html.content,"lxml")
for items in doc.select('table.chart-table tr')[1:11]:
    rank = items.select_one("td.chart-table-position").get_text(strip=True)
    name = items.select_one("td.chart-table-track > strong").get_text(strip=True)
    print(rank,name)

Вывод:

1 Blinding Lights
2 The Box
3 Dance Monkey
4 Don't Start Now
5 Roses - Imanbek Remix
6 In Your Eyes
7 death bed (coffee for your head) (feat. beabadoobee)
8 Say So
9 Intentions (feat. Quavo)
10 Falling
0 голосов
/ 24 марта 2020

Вы можете сделать небольшое исправление ко второму XPath, измените это:

titles = songs.xpath('.//div[@class="chart-table-track"]/text()')

на следующее:

titles = songs.xpath('.//td[@class="chart-table-track"]/*/text()')

и заставьте себя называть эти названия песен и исполнителей, чтобы сделать что-то с их:

['Blinding Lights',
'by The Weeknd',
'The Box',
'by Roddy Ricch',
'Dance Monkey',
'by Tones And I',
"Don't Start Now",
'by Dua Lipa',
...

Намного проще использовать requests-html (который использует lxml внутри, если я не ошибаюсь):

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://spotifycharts.com/regional')

songs_elements = r.html.find('td.chart-table-track')[:10]
titles = [songs_element.text for songs_element in songs_elements]

print('\n'.join(titles))

Вывод:

Blinding Lights by The Weeknd
Dance Monkey by Tones And I
Don't Start Now by Dua Lipa
Roses - Imanbek Remix by SAINt JHN
In Your Eyes by The Weeknd
death bed (coffee for your head) (feat. beabadoobee) by Powfu
Say So by Doja Cat
Intentions (feat. Quavo) by Justin Bieber
Falling by Trevor Daniel

requests-html также Кеннет Рейтц, как requests.

...