Соскоб в сети на Python - как перехватить все элементы <a> - PullRequest
0 голосов
/ 10 октября 2018

Я использую beautifulsoup4 для очистки данных с сайта lyrics.com, в частности, по этой ссылке: 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']

Что может быть не так?

Редактировать: Спасибо всем за ответы!Я проголосовал, но мне не хватает представителя, чтобы показать

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

Другие решения работают нормально, однако я предпочитаю использовать старые добрые селекторы

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>]

Если вы не знакомы с селекторами, это будетзахватить table элементов, которые имеют класс tdata, а затем собрать все свойства href в элементах a

0 голосов
/ 10 октября 2018

Был в состоянии заставить его работать с:

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

Тем не менее, все еще не уверен, почему другой метод не работает, так как я использовал его в другом месте в моей программе без проблем.

0 голосов
/ 10 октября 2018

Это будет работать:

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

Вывод:

['/lyric/15183453/Make+You+Feel+My+Love', '/lyric/15183454/Painting+Pictures']
0 голосов
/ 10 октября 2018

Похоже, вы хотите table.findAll вместо table.find.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...