用beautifulsoup提取style中的背景网址,无需正则表达式?
我有:
<div class="image" style="background-image: url('/uploads/images/players/16113-1399107741.jpeg');"
我想获取网址,但我不知道怎么做,不想用正则表达式。这样做可能吗?
到目前为止,我用正则表达式的解决方案是:
url = re.findall('\('(.*?)'\)', soup['style'])[0]
5 个回答
0
这里有另一种正则表达式的选择,可以确保“background-image: url”也能被匹配到:
re.findall(".*background-image *: *url\((.*)\)", soup["style"])[0]
如果你还想去掉引号,这段代码应该可以做到:
re.findall(".*background-image *: *url\((.*)\)", soup["style"])[0].strip(" \'\"")
1
如果不使用正则表达式,你可以直接用 str.find
和字符串切片来解决问题:
>>> 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'
不过,我觉得在你的情况下,使用正则表达式会更好。
2
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个功能时,发现它的表现和预期不一样。这种情况就需要我们仔细检查代码,看看哪里出了问题。
有时候,问题可能出在我们对某些工具或库的使用上。比如,某个函数可能需要特定的参数,如果我们传入了错误的值,结果就会不如我们所想的那样。理解这些工具的使用方法和限制是非常重要的。
另外,调试也是一个很重要的技能。通过逐步检查代码,看看每一步的输出,我们可以找到问题的根源。很多时候,问题并不是出在我们想象中的地方,而是在一些细节上。
总之,编程是一门需要不断学习和实践的技能。遇到问题时,不要气馁,仔细分析,寻找解决方案,慢慢你就会变得越来越熟练。
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 ')'
3
你可以试试用 str.split
这个方法:
>>> style
'<div ... url(\'/uploads/images/players/16113-1399107741.jpeg\');"'
>>> style.split("('", 1)[1].split("')")[0]
'/uploads/images/players/16113-1399107741.jpeg'
17
你可以试试使用 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'
虽然最后你还是需要提取出实际的链接,但这个方法对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'