【问题标题】:Regex not returning specific match正则表达式不返回特定匹配
【发布时间】:2016-09-08 14:19:23
【问题描述】:

我正在尝试从网站上的脚本标签中提取链接。 目前我的正则表达式出于某种原因返回整个块..

这是我要从中获取链接的脚本标签的内容:

<script type="text/javascript">
var key = '';
var url = 'http://stream1.song365.me/h1/20160129/1772422101/The%20Beatles%20-%20There%27s%20a%20Place%20%28Studio%20Outtake%20Takes%205%20%26%206%29_(song365.cc).mp3';
var hqurl = 'http://stream1.song365.me/h1/20160129/1772422101/The%20Beatles%20-%20There%27s%20a%20Place%20%28Studio%20Outtake%20Takes%205%20%26%206%29_(song365.cc).mp3';
$(document).ready(function(){
    $("div[rel='digg']").click(function(){
        var method = $(this).attr("method");
        var v = parseInt($(this).find('em').html());
        var p = this;
        $.post("/track/digg/2788951/" + method, function(data){
            if(data.status==0)
            {
                alert("today you have been digg it!")
            }
            else
            {
                $(p).find('em').html(data.number);
            }
        }, "JSON")
    })
    if(url.length!=0)
    {
        $("#download-link").attr("href", url + "?key=" + key).css("display","");;
    }
    if(hqurl.length!=0)
    {
        $("#download-link-hq").attr("href", hqurl + "?key=" + key).css("display","");
    }
});
</script>

这是我目前拥有的代码:

request = requests.get(dummy_link)
    data = request.text
    soup = BeautifulSoup(data, 'html.parser')
    link = soup.findAll(text=re.compile('var hqurl.*?mp3'))

它返回整个脚本标签,但我只想要分配给hqurl 变量的链接。

在@alecxe 的帮助下的当前代码:

request = requests.get('https://www.song365mp3.biz/download/the-beatles-there039s-a-place-studio-outtake-takes-5-amp-6-2788951.html')
    data = request.text
    soup = BeautifulSoup(data, 'html.parser')
    pattern = re.compile("var hqurl = '(.*?mp3)';$", re.MULTILINE | re.DOTALL)
    link = soup.find("script", text=pattern)
    print(pattern.search(link.text).group(1))

但抛出错误:

    print((link.text).group(1))
AttributeError: 'ResultSet' object has no attribute 'text'

【问题讨论】:

  • 如果您正在执行请求然后对其进行解析,则您提供的代码不是您想要从中获取链接的内容。如果您可以提供部分已解析的 html 以及您需要的链接,我们将能够提供帮助
  • @DNKROZ 我修复了它,但链接无关紧要,因为它总是会改变。
  • 抱歉,我没有意识到您发布的代码是您想要从中提取链接的位置。我认为这是另一个回应 - 添加了一个应该是你需要的答案

标签: regex python-3.x beautifulsoup python-requests


【解决方案1】:

预编译模式并重用以定位元素和提取链接:

pattern = re.compile("var hqurl = '(.*?mp3)';", re.MULTILINE | re.DOTALL)
link = soup.find("script", text=pattern)
print(pattern.search(link.text).group(1))

请注意,我改进了表达式并添加了一个捕获组,它将实际链接保存在一个组中,然后我们可以通过.group(1) 访问该组。

打印:

http://stream1.song365.me/h1/20160129/1772422101/The%20Beatles%20-%20There%27s%20a%20Place%20%28Studio%20Outtake%20Takes%205%20%26%206%29_(song365.cc).mp3

【讨论】:

  • 我收到了:print(pattern.search(link.text).group(1))AttributeError: 'NoneType' object has no attribute 'text'
  • @ou_snaaksie 你确定你已经复制了代码吗?谢谢。
  • 是的,很确定
  • @ou_snaaksie 好的,请编辑问题并发布您当前正在执行的完整代码。因为它适用于您的示例数据。谢谢。
  • 我已更新原始帖子以反映更改。
【解决方案2】:

试试这个:link = soup.findAll(text=re.compile('var hqurl = (.*?mp3)'))

https://regex101.com/r/jX7xK7/1

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多