2014-02-20 51 views
1

我从网站上用python和BS4抓取一系列链接,但是我需要清理它们,所以我只能得到字符串中的URL。从python中的字符串中除去一切,但是除去网址

的链接我得到这个样子:

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

,我需要它看起来像这样

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

+1

你有什么企图? – spiehr

+0

所有字符串都是完全相同的格式,还是HTML中存在可能导致简单规则失败的边界情况? – jozxyqk

+0

我忘了提及我抓取的所有链接都不一样。他们都以javascript:changeChannel开头('部分,但网址不同,最后一个结尾'在所有链接中也不相同 – user3332151

回答

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);'] 
+0

是真的,我准备发布这个,但是它并没有给你一些东西也许,你可以做到这一点,然后_then_用正则表达式搜索来确定索引值 –

+0

那么,如果所有的字符串格式化相同,这可能适用于每个人。 ? –

+0

例如,这条线上只有两个单引号。实质上,这种解决方案只适用于这个问题,但并不能解决问题。 –

0
str = javascript:changeChannel('http://some-server.com/with1234init.also', 20); 
formattedtext ="http://" + str.split("http://")[1].split(',')[0].strip("'") 
0

一个相当健壮的方法是把你的大块文本和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

    注意该网页的网址版本使用r前缀和接近尾声的逃脱'报价在第一种模式中。使用

  2. re.compile缓存中的正则表达式模式