【问题标题】:Get only URL from string - Python仅从字符串中获取 URL - Python
【发布时间】:2014-11-21 18:11:13
【问题描述】:

我正在使用 PythonBeautifulSoup 库抓取页面。

我必须只从这个字符串中获取 URL。这实际上在a 标签的href 属性中。我已经抓取了它,但似乎找不到从中提取 URL 的方法

javascript:void%20window.open('/Sheraton-Tucson-Hotel-177/tnc/150/24795/en','TC_POPUP','width=490,height=405,screenX=300,screenY=250,top=250,left=300,scrollbars=yes,resizable=no');

【问题讨论】:

  • 从 ( 到 ) 取子串会不会太容易了?
  • 得到()里面的子串,然后在,的基础上炸开,得到第一个索引值
  • 哦,对不起,我没有注意到括号内有超过 1 个字符串

标签: python python-3.x beautifulsoup


【解决方案1】:

您可以编写一个简单的正则表达式来提取 URL。

>>> import re
>>> href = "javascript:void%20window.open('/Sheraton-Tucson-Hotel-177/tnc/150/24795/en','TC_POPUP','width=490,height=405,screenX=300,screenY=250,top=250,left=300,scrollbars=yes,resizable=no');"
>>> re.findall(r"'(.*?)'", href)
['/Sheraton-Tucson-Hotel-177/tnc/150/24795/en', 'TC_POPUP', 'width=490,height=405,screenX=300,screenY=250,top=250,left=300,scrollbars=yes,resizable=no']
>>> _[0]
'/Sheraton-Tucson-Hotel-177/tnc/150/24795/en'

这里有问题的正则表达式是

'(.*?)'

它的内容是“找到一个单引号,然后是任何内容(并捕获任何内容),然后是另一个单引号,并且由于 ? 运算符而非贪婪地这样做”。这会提取window.open 的参数;然后,只需选择第一个获取 URL。

您的 href 中不应有任何嵌套的 ',因为它们应该转义为 %27。但是,如果这样做,这将不起作用,您可能需要一个不使用正则表达式的解决方案。

【讨论】:

  • 我试一试...顺便说一下..我也可以先得到()中的字符串然后爆破,然后得到第一个元素
【解决方案2】:

我就是这样做的。

terms = javascript:void%20window.open('/Sheraton-Tucson-Hotel-177/tnc/150/24795/en','TC_POPUP','width=490,height=405,screenX=300,screenY=250,top=250,left=300,scrollbars=yes,resizable=no');

terms.split("('")[1].split("','")[0]

输出

/Sheraton-Tucson-Hotel-177/tnc/150/24795/en

【讨论】:

    【解决方案3】:

    代替正则表达式,您可以将其分区两次,(例如:'):

    s.partition("'")[2].partition("'")[0]
    # /Sheraton-Tucson-Hotel-177/tnc/150/24795/en
    

    【讨论】:

    • 也请看我的回答......你建议哪个好
    • @Mani 通过使用分区,您只拆分“一次”,并且保证在不存在分隔符的情况下获得空字符串。所以 1)它更有效,2)它更安全,因为你的 .split 可能会在它不存在的地方引发 IndexError ......不过,你选择的分隔符可能更明智
    【解决方案4】:

    这是一个快速而丑陋的答案

    href.split("'")[1]
    

    【讨论】:

    • 算法规则 #1:为什么要使用 2 个拆分,什么时候可以使用 1
    • 你的线路产生了一个错误......这就是为什么我说我可以给你投反对票
    • href = "javascript:void%20window.open('/Sheraton-Tucson-Hotel-177/tnc/150/24795/en','TC_POPUP','width=490,height=405,screenX=300,screenY=250,top=250,left=300,scrollbars=yes,resizable=no');" print(href.split("'")[1]) 这运行得很好。不知道你在说什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2012-11-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多