使用Beautiful Soup构建Discord爬虫Bot时,如何逐个提取并格式化输出爬取到的书名
如何将爬取的书名逐个拼接成Discord消息格式?
看起来你已经成功爬取到目标书名了,问题出在对a.string的理解和消息拼接的方式上——咱们一步步来解决:
问题根源
你循环里的每一个a标签对应单个书名,所以a.string本身就是完整的书名字符串(比如第一次循环是"Raymond Carver",第二次是那串长书名)。这时候用a.string[索引]自然只会取这个字符串里的单个字符,而不是多个书名的列表元素。
解决方案1:循环逐个追加字符串
初始化一个空的message变量,然后在遍历每个书名时,把它按你要的格式追加进去:
import requests, urllib3 from bs4 import BeautifulSoup urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) name = "Raymond" r = requests.get("https://1lib.ch/s/{}?order=bestmatch".format(name), verify=False) soup = BeautifulSoup(r.text, "lxml") message = "" for a in soup.find_all("a", style="text-decoration: underline;", limit=2): # 每个书名后加两个换行,和你想要的格式一致 message += f"{a.string}\n\n" # 可选:去掉末尾多余的换行,避免消息最后出现空行 message = message.strip() # 现在message就是你要的格式了 print(message)
解决方案2:用列表收集+join拼接(更高效简洁)
先把所有书名收集到列表里,再用join方法一次性拼接成目标格式,这种方式处理大量数据时更高效:
import requests, urllib3 from bs4 import BeautifulSoup urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) name = "Raymond" r = requests.get("https://1lib.ch/s/{}?order=bestmatch".format(name), verify=False) soup = BeautifulSoup(r.text, "lxml") # 列表推导式收集所有书名 book_titles = [a.string for a in soup.find_all("a", style="text-decoration: underline;", limit=2)] # 用两个换行符连接所有书名 message = "\n\n".join(book_titles) print(message)
额外提示
如果担心爬取的a.string可能为空(比如某些标签没有文本),可以加个判断过滤掉空值:
book_titles = [a.string for a in soup.find_all("a", style="text-decoration: underline;", limit=2) if a.string]
内容的提问来源于stack exchange,提问作者Scorpio
相关产品推荐
相关产品推荐

