Python中的Web抓取如何捕获所有<a>元素

2024-05-23 15:51:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用beautifulsoup4从歌词网网站,特别是这个链接:https://www.lyrics.com/album/1447935。你知道吗

从这个块中,我试图提取两个<a>元素:

[<table class="tdata">
    <colgroup>
        <col style="width: 50px;"/>
        <col style="width: 430px;"/>
        <col style="width: 80px;"/>
        <col style="width: 80px;"/>
    </colgroup>
    <thead>
        <tr>
            <th>#</th>
            <th>Song</th>
            <th>Duration</th>
            <th> </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td class="tal qx">1</td>
            <td class="tal qx">
                <strong>
                    <a href="/lyric/15183453/Make+You+Feel+My+Love">Make You Feel My Love</a>
                </strong>
            </td>
            <td class="tal qx">3:32</td>
            <td class="tal vam rt"> 
            </td></tr><tr><td class="tal qx">2</td>
            <td class="tal qx">
                <strong>
                    <a href="/lyric/15183454/Painting+Pictures">Painting Pictures</a>
                </strong>
            </td>
            <td class="tal qx">3:33</td>
            <td class="tal vam rt"> </td>
        </tr>
    </tbody>
</table>]

这是我的密码:

url = "http://www.lyrics.com" + album_url
page = r.get(url)
soup = bs(page.content, "html.parser")
songs = [a.get('href') for a in (table.find('a') for table in soup.findAll('table')) if a]

但是,它只返回第一个<a>

['/lyric/15183453/Make+You+Feel+My+Love']

有什么问题吗?你知道吗

编辑:谢谢大家的回答!我投了更高的票,但我没有足够的代表来展示


Tags: youmakestyletablecolwidthtrclass
3条回答

这将起作用:

songs = [song['href'] for song in soup.select('table a')]

输出:

['/lyric/15183453/Make+You+Feel+My+Love', '/lyric/15183454/Painting+Pictures']

其他解决方案很好,但我更喜欢使用好的旧选择器

from bs4 import BeautifulSoup as bs
import requests as req
page = req.get('https://www.lyrics.com/album/1447935')
soup = bs(page.content, 'html.parser')
links = soup.select('table.tdata a[href]')
print(links)

这将打印

[<a href="/lyric/15183453/Make+You+Feel+My+Love">Make You Feel My Love</a>, <a href="/lyric/15183454/Painting+Pictures">Painting Pictures</a>]

如果您不熟悉选择器,这将获取具有类tdatatable元素,然后收集a元素上的所有href属性

能够使它与:

for a in soup.findAll('a'):
    if a.parent.name == 'strong':
        if a.parent.parent.name == 'td':
            print(a["href"])

不过,我仍然不知道为什么其他方法不起作用,因为我在程序的其他地方使用过它,没有任何问题。你知道吗

相关问题 更多 >