如何使用Beautiful Soup从HTML中提取特定的URL?

时间:2014-06-16 13:54:52

标签: python html regex python-2.7 beautifulsoup

我想从HTML页面中提取特定的URL。

from urllib2 import urlopen
import re
from bs4 import BeautifulSoup

url = http://bassrx.tumblr.com/tagged/tt    # nsfw link
page = urlopen(url)
html = page.read()    # get the html from the url

# this works without BeautifulSoup, but it is slow:
image_links = re.findall("src.\"(\S*?media.tumblr\S*?tumblr_\S*?jpg)", html)

print image_links

上面的输出正是URL,没有别的:http://38.media.tumblr.com/tumblr_ln5gwxHYei1qi02clo1_500.jpg

唯一的缺点是它很慢。

BeautifulSoup在解析HTML方面非常快,所以这就是我想要使用它的原因。

我想要的网址实际上是img src。这是来自HMTL的片段,其中包含我想要的信息。

    <div class="media"><a href="http://bassrx.tumblr.com/image/85635265422">
    <img src="http://38.media.tumblr.com/tumblr_ln5gwxHYei1qi02clo1_500.jpg"/>
</a></div>

所以,我的问题是,我怎样才能让BeautifulSoup干净利落地提取所有这些'img src'网址而没有任何其他瑕疵?

我只想要一个匹配网址列表。我一直在尝试使用soup.findall()函数,但无法获得任何有用的结果。

3 个答案:

答案 0 :(得分:1)

from urllib2 import urlopen
from bs4 import BeautifulSoup

url = 'http://bassrx.tumblr.com/tagged/tt'
soup = BeautifulSoup(urlopen(url).read())

for element in soup.findAll('img'):
    print(element.get('src'))

答案 1 :(得分:0)

您可以使用div.media > a > img CSS selector查找img内的a个标记,该标记位于div标记内media类:

from urllib2 import urlopen
from bs4 import BeautifulSoup

url = "<url_here>"
soup = BeautifulSoup(urlopen(url))
images = soup.select('div.media > a > img')
print [image.get('src') for image in images]

为了使解析速度更快,您可以使用lxml解析器:

soup = BeautifulSoup(urlopen(url), "lxml")

当然,您需要先安装lxml模块。

此外,您可以使用SoupStrainer类来仅解析文档的相关部分。

希望有所帮助。

答案 2 :(得分:0)

使用re.compile mix看看BeautifulSoup.find_all

from urllib2 import urlopen
import re
from bs4 import BeautifulSoup

url = "http://bassrx.tumblr.com/tagged/tt"    # nsfw link
page = urlopen(url)
html = page.read()    
bs = BeautifulSoup(html)
a_tumblr = [a_element for a_element in bs.find_all(href=re.compile("media\.tumblr"))]
##[<link href="http://37.media.tumblr.com/avatar_df3a9e37c757_128.png" rel="shortcut icon"/>, <link href="http://37.media.tumblr.com/avatar_df3a9e37c757_128.png" rel="apple-touch-icon"/>]