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

0 投票
3 回答
1924 浏览
提问于 2025-04-18 09:57

我想从一个HTML页面中提取特定的链接。

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

上面的结果就是我想要的链接,没别的:http://38.media.tumblr.com/tumblr_ln5gwxHYei1qi02clo1_500.jpg

唯一的问题是这个过程非常慢。

BeautifulSoup在解析HTML方面非常快,所以我想用它。

我想要的链接其实是img src的内容。这是我想要的信息的一小段HTML。

    <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

你可以使用 div.media > a > img 这个 CSS选择器 来找到在一个带有 media 类的 div 标签里面的 a 标签中的 img 标签。

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 类,只解析文档中相关的部分。

希望这些对你有帮助。

0

看看如何将BeautifulSoup的find_all和re.compile结合使用

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"/>]
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'))

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答