首页 > 解决方案 > BeautifulSoup,试图从包含作者姓名的锚标签中提取文本

问题描述

我正在尝试从这本书网站上抓取一些数据。我需要提取标题和作者。我能够毫不费力地提取标题。但是,当有多个作者时,我在提取作者时遇到问题,因为它们出现在同一行中,并且它们属于标题 h4 中的单独锚标记。

<h4>
    "5
  . "
  <a href="/items/705">The Elements of Style</a>
" by " 
   <a href="/authors/5107">William Strunk, Jr</a>
   ", " 
   <a href="/authors/5108">E. B. White</a>
</h4>

这是我尝试过的:

book_container = soup.find_all('li', class_='item pb-3 pt-3 border-bottom')

for container in book_container:

# title
title = container.h4.a.text
titles.append(title)

# author(s)
author_s = container.h4.find_all('a')
print('### SECOND FOR LOOP ###')
for a in author_s:
   
    if a['href'].startswith('/authors/'):
        
        print(a.text)
       

我想在一个元组中有两个作者。

标签: pythonbeautifulsoupscreen-scraping

解决方案


这可能不是最 Pythonic 的方式,但它是一种解决方法。

newlist = []
for a in author_s:
    if a['href'].startswith('/authors/'):
        if len(author_s)>2:
            newlist.append(a.text)
            print(tuple(newlist))
        else:
            print(a.text)

我正在利用变量author_s将包含一个我们可以检查更多名称的列表这一事实。列表中超过 2 个,意味着更多的作者。(或者,您也可以检查打印中是否存在换行符)

您还会注意到打印输出将有两个元组。总是提取第二个。一位作者的其余部分将保持不变。由于此请求没有多行两位作者,因此我无法检查并发症。

输出:

[<a href="/items/705">The Elements of Style</a>, <a href="/authors/5107">William Strunk, Jr</a>, <a href="/authors/5108">E. B. White</a>]
### SECOND FOR LOOP ###
('William Strunk, Jr',)
('William Strunk, Jr', 'E. B. White')

推荐阅读