Python从html中获取所有链接,仅显示链接

时间:2012-08-01 20:54:43

标签: python regex

我正试图使用​​以下声明从网页中获取标题:

titl1 = re.findall(r'<title>(.*?)</title>',the_webpage)

使用它,我得到['random webpage example1']。如何删除引号和括号?


我还试图抓住一组每小时更改的链接(这就是我需要通配符的原因):links = re.findall(r'(file=(.*?).mp3)',the_webpage)

我得到了

[('file=http://media.kickstatic.com/kickapps/images/3380/audios/944521.mp3', 
  'http://media.kickstatic.com/kickapps/images/3380/audios/944521'), 
 ('file=http://media.kickstatic.com/kickapps/images/3380/audios/944521.mp3', 
  'http://media.kickstatic.com/kickapps/images/3380/audios/944521'), 
 ('file=http://media.kickstatic.com/kickapps/images/3380/audios/944521.mp3', 
  'http://media.kickstatic.com/kickapps/images/3380/audios/944521')]

如何在没有file=的情况下获取mp3链接?


我还想下载mp3文件,并附上网站标题,以便显示

random webpage example1.mp3

我该怎么做?我还在学习Python和正则表达式,这有点让我感到难过。

4 个答案:

答案 0 :(得分:0)

至少在第1部分,你可以做到

>>> mytitle = title1[0]
>>> print mytitle
random webpage example1

正则表达式返回一个匹配的字符串列表,所以你只需要抓住列表中的第一个项目。

同样,对于第二部分,正则表达式返回一个里面有元组的列表。 你可以这样做:

>>> download_links = [href for (discard, href) in links]
>>> print download_links
['http://media.kickstatic.com/kickapps/images/3380/audios/944521', 'http://media.kickstatic.com/kickapps/images/3380/audios/944521', 'http://media.kickstatic.com/kickapps/images/3380/audios/944521']  

对于下载文件,请使用urlib2(至少对于python 2.x,不确定python 3.x)。有关详细信息,请参阅this question

答案 1 :(得分:0)

第1部分 titl1 = re.findall(r'<title>(.*?)</title>',the_webpage)将返回一个列表,当您打印列表时,它将打印括号和引号。如果您确定始终只有一个匹配,请尝试print title[0]。 (你也可以试试re.search)


对于第二部分,如果您将重新模式从"(file=(.*?)\.mp3)"更改为"file=(.*?)\.mp3",您将只获得添加.mp3扩展名所需的'http://linkInThisPart/path/etc/etc'部分。

audio_links = [x +'.mp3' for x in re.findall(r'file=(.*?)\.mp3',web_page)]

要下载您可能想要查看的文件urllib,urllib2

import urllib2
url='http://media.kickstatic.com/kickapps/images/3380/audios/944521.mp3'
req=urllib2.Request(url)
temp_file=open('random webpage example1.mp3','wb')
buffer=urllib2.urlopen(req).read()
temp_file.write(buff)
temp_file.close()

答案 2 :(得分:0)

代码:

#!/usr/bin/env python

import re,urllib,urllib2

Url = "http://www.ihiphopmusic.com/music/rick-ross-sixteen-feat-andre-3000"
print Url
print 'test .............'
req = urllib2.Request(Url)
print "1"
response = urllib2.urlopen(req)
print "2"
the_webpage = response.read()
print "3"
titl1 = re.findall(r'<title>(.*?)</title>',the_webpage)
print "4"
a2 = [x +'.mp3' for x in re.findall(r'file=(.*?)\.mp3',the_webpage)]
print "5"
a2 = [x[0][5:] for x in a2]
print "6"
ti = titl1[0]
print ti
print "7"
print a2
print "8"

print "9"
#print the_page
print "10"

req=urllib2.Request(a2)
print "11"
temp_file=open(ti)
print "12"
buffer=urllib2.urlopen(req).read()
print "13"
temp_file.write(buff)
print "14"
temp_file.close()
print "15"
print "16"

结果

http://www.ihiphopmusic.com/music/rick-ross-sixteen-feat-andre-3000
test .............
1
2
3
4
5
6
Rick Ross - Sixteen (feat. Andre 3000)
7
['', '', '']
8
9
10
Traceback (most recent call last):
  File "grub.py", line 29, in <module>
    req=urllib2.Request(a2)
  File "/usr/lib/python2.7/urllib2.py", line 198, in __init__
    self.__original = unwrap(url)
  File "/usr/lib/python2.7/urllib.py", line 1056, in unwrap
    url = url.strip()
AttributeError: 'list' object has no attribute 'strip'

答案 3 :(得分:0)

Python 3:

import requests
import re
from urllib.request import urlretrieve

- 首先获取HTML文字

html_text=requests.get('url')

- 正则表达式找到网址

  

正则表达式模式,匹配(&#39;模式&#39;,&#39;文字&#39;,标志)

     

在模式中,&#39;()&#39;用于分组你想要的。在这种情况下,我们将&#39; http://*****.mp3'组合在一起,您可以使用.group(1)或groups()来引用它。

url_find=re.findall('file=(http://media.mp3*',html_text)
for url_match in url_matches:
    index += 1
    print(url_match)
    urlretrieve(url_match, './graber/mp3/user' + str(index) + '.mp3')

我是如何完成的,希望这会有所帮助。(下载的方法有多种方式,在这种情况下,我使用urlretrieve)