从样式中提取url:background-url:使用beautifulsoup而不使用正则表达式?

问题描述 投票:-2回答:5

我有:

<div class="image" style="background-image: url('/uploads/images/players/16113-1399107741.jpeg');"

我想得到网址,但是如果不使用正则表达式我就无法做到这一点。它甚至可能吗?

到目前为止我的正则表达式的解决方案是:

url = re.findall('\('(.*?)'\)', soup['style'])[0]
python string web-scraping beautifulsoup
5个回答
5
投票

您可以尝试使用cssutils包。这样的事情应该有效:

import cssutils
from bs4 import BeautifulSoup

html = """<div class="image" style="background-image: url('/uploads/images/players/16113-1399107741.jpeg');" />"""
soup = BeautifulSoup(html)
div_style = soup.find('div')['style']
style = cssutils.parseStyle(div_style)
url = style['background-image']

>>> url
u'url(/uploads/images/players/16113-1399107741.jpeg)'
>>> url = url.replace('url(', '').replace(')', '')    # or regex/split/find/slice etc.
>>> url
u'/uploads/images/players/16113-1399107741.jpeg'

虽然您最终需要解析实际URL,但此方法应该对HTML中的更改更具弹性。如果你真的不喜欢字符串操作和正则表达式,你可以用这种迂回方式拉出网址:

sheet = cssutils.css.CSSStyleSheet()
sheet.add("dummy_selector { %s }" % div_style)
url = list(cssutils.getUrls(sheet))[0]
>>> url
u'/uploads/images/players/16113-1399107741.jpeg'

2
投票

如何使用str.split

>>> style
'<div ... url(\'/uploads/images/players/16113-1399107741.jpeg\');"'
>>> style.split("('", 1)[1].split("')")[0]
'/uploads/images/players/16113-1399107741.jpeg'

1
投票

没有正则表达式,你可以使用str.find和str slice:

>>> s
"background-image: url('/uploads/images/players/16113-1399107741.jpeg');"
>>> s.find("('")
21
>>> s.find("')")
68
>>> s[21+len("('"):68]
'/uploads/images/players/16113-1399107741.jpeg'

但是,我觉得在你的情况下使用正则表达式更好。


0
投票
In [1]: s = "background-image: url('/uploads/images/players/16113-1399107741.jpeg');"

In [2]: start = s.find("url('")

In [3]: start
Out[3]: 18

In [4]: end = s.find("');")

In [5]: end
Out[5]: 68

In [6]: url = s[start+len("url('"):end]

In [7]: url
Out[7]: '/uploads/images/players/16113-1399107741.jpeg'

0
投票
from bs4 import BeautifulSoup
import re
html = """<div class="image" style="background-image: url('/uploads/images/players/16113-1399107741.jpeg');"""

soup = BeautifulSoup(html,'html.parser')
image_div = soup.find('div')['style']

ptr = re.search("http.*[)]",image_div) # regex to search url till ')'
print(image_div[ptr.start():ptr.end()-1]) # end() -1 to remove ')' 
© www.soinside.com 2019 - 2024. All rights reserved.