首页 > 解决方案 > 试图从以','结尾的字符串中获取所有链接

问题描述

我需要从 Genius 页面获取艺术家专辑的所有链接。所有链接都可以在属性data-preload_data的第五个标签 preload-content值中找到。该值以 str 的形式存储在 var 字符串中。

我试图提取所有以“https://genius.com/albums/”开头并以“,”结尾的链接,但没有成功。当我没有使用 $ 符号结束时,我得到了适量的链接,但没有必要的结束部分

import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import ssl
from urllib.request import Request, urlopen
import re

name = input('Rapper - ')
url = 'https://genius.com/artists/'+name+''
hdr = {'User-Agent': 'Mozilla/5.0'}
req = Request(url,headers=hdr)
html = urlopen(req)
soup = BeautifulSoup(html, 'html.parser')

hrefs = soup.find_all("preload-content")
string = hrefs[5]['data-preload_data']

result = re.findall('(https://genius.com/albums/'+name+'.,$)', string)
print(result)

标签: pythonregexbeautifulsoup

解决方案


您可以使用

re.findall(r'(https://genius\.com/albums/' + re.escape(name) + '/[^"\'\s<>]*?)&quot;,', string)

请参阅正则表达式演示

细节

  • (https://genius\.com/albums/' + re.escape(name) + '/[^"\'\s<>]*?)- 第 1 组:
    • https://genius\.com/albums/' + re.escape(name) + '/ - 文字子串
    • [^"\'\s<>]*?"- 除、'、 空格<和之外的任何零个或多个字符>,尽可能(由于*?惰性量词)
  • &quot;,- 文字字符串

请注意,name当在正则表达式中使用时,必须对所有特殊字符进行转义,以使正则表达式在语法上正确,因此使用re.escape(name).


推荐阅读