Python web抓取html与xpath语法问题

Python web抓取html与xpath语法问题,python,html,xpath,lxml,Python,Html,Xpath,Lxml,我是python的新手,我正试图获得公告牌100强排行榜。我知道已经有一个图书馆了,但我正在练习(而且做得不一样)。我的问题是Billboard的歌曲列表与艺术家不匹配,因为选择艺术家的语法在“a”元素和“span”元素之间变化。如何包含这两种类型的元素,这两种元素都包含[@class=“chart-row\uuu-artist”] 目前我有: artists = [x.strip() for x in tree.xpath('//a[@class="chart-row__artist"]/te

我是python的新手,我正试图获得公告牌100强排行榜。我知道已经有一个图书馆了,但我正在练习(而且做得不一样)。我的问题是Billboard的歌曲列表与艺术家不匹配,因为选择艺术家的语法在“a”元素和“span”元素之间变化。如何包含这两种类型的元素,这两种元素都包含[@class=“chart-row\uuu-artist”]

目前我有:

artists = [x.strip() for x in tree.xpath('//a[@class="chart-row__artist"]/text()')]
但这也会拉起歌曲的跨度:

artists = [x.strip() for x in tree.xpath('//span[@class="chart-row__artist"]/text()')]

它在页面上交替出现。有什么建议吗?

我想我对XPath的语法理解正确。尽管艺术家的元素节点是交替的,但似乎歌曲与艺术家的匹配是适当的。我这样做:

artists = [x.strip() for x in tree.xpath('//*[@class="chart-row__artist"]/text()')]

前缀//*选择了整个文档,然后与类名进行匹配,因此它同时包含了“a”元素和“span”元素。

是否需要使用xpath?我很容易就得到了bs4所有艺术家的名单

import requests
from bs4 import BeautifulSoup

response = requests.get('https://www.billboard.com/charts/hot-100')
soup = BeautifulSoup(response.content, 'lxml')
artists = [row.text.strip() for row in soup.select('.chart-row__artist')]
print(artists)

有趣!谢谢你的意见。这似乎更简单。