Python 剥离beautfulsoup返回的链接

Python 剥离beautfulsoup返回的链接,python,regex,hyperlink,beautifulsoup,Python,Regex,Hyperlink,Beautifulsoup,当我使用beautifulsoup时,我从href返回以下代码 "/url?q=http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf&sa=U&ei=HkNsUauqN_GQiAf5p4CwDg&ved=0CDkQFjAJ&usg=AFQjCNGk0DTzu2K2ieIKS-SXAeS5-VYTgA" 最简单的方法是什么,只切割http://.... pdf以便我可以下载该文件

当我使用beautifulsoup时,我从href返回以下代码

"/url?q=http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf&sa=U&ei=HkNsUauqN_GQiAf5p4CwDg&ved=0CDkQFjAJ&usg=AFQjCNGk0DTzu2K2ieIKS-SXAeS5-VYTgA"
最简单的方法是什么,只切割http://.... pdf以便我可以下载该文件

for link in soup.findAll('a'):
    try:
            href = link['href']
            if re.search(re.compile('\.(pdf)'), href):
            print href
    except KeyError:
            pass

它们的一致性如何

href.split('q=')[1].split('&')[0]
没有正则表达式也能工作。这也可以做到:

href[7:href.index('&')] # may need +1 after .index call
它们似乎都在我的交互式终端中工作:

>>> s = "/url?q=http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf&sa=U&ei=HkNsUauqN_GQiA f5p4CwDg&ved=0CDkQFjAJ&usg=AFQjCNGk0DTzu2K2ieIKS-SXAeS5-VYTgA"
>>>
>>> s[7:s.index('&')]
'http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf'
>>>
>>> s.split('q=')[1].split('&')[0]
'http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf'
>>>
您也可以使用此正则表达式到达:

>>> import re
>>>
>>> re.findall('http://.*?\.pdf', s)
['http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf']
>>>

一种更具python风格的方法是
urlparse
库:

A = "/url?q=http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf&sa=U&ei=HkNsUauqN_GQiAf5p4CwDg&ved=0CDkQFjAJ&usg=AFQjCNGk0DTzu2K2ieIKS-SXAeS5-VYTgA"

import urlparse
sol = urlparse.parse_qs(A)
print sol["/url?q"][0]
其中:

>> http://druid8.sit.aau.dk/acc_papers/kdln4ccpef78ielqg01fuabr81s1.pdf
如果您使用的是Python3,synatax会略有不同,上面显示的是Python2.7版本。如果您还喜欢其他参数,这非常好,例如:

print sol["ved"]
>> ['0CDkQFjAJ']

?q=
和下一个
&
之间切换?不需要正则表达式。它们在前面是一致的,但在最后总是有&或%。然而,自然文件名有时有%字符。@JosephLee-我添加了一个regex选项,它也可以工作。如果您可以使用字符串方法来解决它,您将比
re
库所需的开销少。无论哪种方式,都应该是可行的。这是一个很好的答案。:)