【问题标题】:Strip everything but URL from a string in python从python中的字符串中删除除URL之外的所有内容
【发布时间】:2014-03-21 05:29:05
【问题描述】:

我正在使用 python 和 BS4 从一个网站获取一系列链接,但我需要清理它们,所以我只能获取字符串中的 URL。

我得到的链接是这样的:

javascript:changeChannel('http://some-server.com/with1234init.also', 20);

我需要它看起来像这样

http://some-server.com/with1234init.also

【问题讨论】:

  • 你的尝试是什么?
  • 所有字符串的格式是否完全相同,或者 HTML 中是否存在可能导致简单规则失败的极端情况?
  • 我忘了提到我抓取的所有链接都是不同的。它们都以 javascript:changeChannel(' 部分开头,但网址不同,最后一个 ' 之后的结尾在所有链接中也不同

标签: python string


【解决方案1】:

好吧,如果所有的链接都是这样的,你可以用一种非常简单的方法来做到这一点:

s.split("'")[1]

例如:

>>>s="javascript:changeChannel('http://some-server.com/with1234init.also', 20);"
>>>s.split("'")
['javascript:changeChannel(',
 'http://some-server.com/with1234init.also',
 ', 20);']

【讨论】:

  • 没错,我正要发布这个,但是,它并没有给你确切的信息。也许,您可以这样做,然后然后使用正则表达式进行搜索以确定索引值。
  • 好吧,如果所有字符串的格式都相同,这可能对每个人都有效。你说的不准确是什么情况?
  • 例如,一行中有两个以上的单引号。本质上,这个解决方案只能解决这个问题,但不能解决整个问题。
  • @GamesBrainiac 你是对的。该解决方案是非常特定于领域的。我在答案中解释说所有字符串 需要 具有相同的格式。但如果是的话,我认为值得这样做,因为它非常简单。
  • 确实,但我希望您知道一些使用正则表达式捕获 URL(呵呵)的方法。我一直在尝试自己制作一个,但大多数时候我都失败了。
【解决方案2】:
 str = javascript:changeChannel('http://some-server.com/with1234init.also', 20);
 formattedtext  ="http://" + str.split("http://")[1].split(',')[0].strip("'")

【讨论】:

    【解决方案3】:

    一种相当可靠的方法是获取您的文本块并使用与 URL 匹配的正则表达式模式对其进行搜索。

    另见:

    使用正则表达式...

    import re
    re.search(pattern, text)
    ... or
    re.findall(pattern, text)
    

    一个完整的例子......

    >>> p = re.compile(r'(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))')
    or
    >>> p = re.compile('(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\\\'".,<>?\xc2\xab\xc2\xbb\xe2\x80\x9c\xe2\x80\x9d\xe2\x80\x98\xe2\x80\x99]))')
    
    >>> m = p.search("javascript:changeChannel('http://some-server.com/with1234init.also', 20);")
    >>> m.group()
    'http://some-server.com/with1234init.also'
    
    1. 使用的模式来自 above link 中的 Web URL 版本

      注意在第一个模式中使用r 前缀和转义的' 引号。

    2. 使用re.compile 缓存正则表达式模式

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 2014-03-26
      • 1970-01-01
      • 2010-10-24
      • 2012-12-10
      • 2013-08-08
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多