我想从下面的HTML代码解析HD价格。我只有html代码的片段,所以我不能使用HTML解析器。
<div id="left-stack">
<span>View In iTunes</span></a>
<span class="price">£19.99</span>
<ul class="list">
<li>HD Version</li>
基本上,格式是“找到单词之前的价格”HD版本“(不区分大小写)。这是我到目前为止所拥有的:
re.match(r'^(\d|.){1,6}...HD\sVersion', string)
如何从上面的字符串中提取值“19.99”?
答案 0 :(得分:4)
BeautifulSoup
对于它解析的HTML是very lenient,您也可以将其用于HTML的块/部分:
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
data = u"""
<div id="left-stack">
<span>View In iTunes</span></a>
<span class="price">£19.99</span>
<ul class="list">
<li>HD Version</li>
"""
soup = BeautifulSoup(data)
print soup.find('span', class_='price').text[1:]
打印:
19.99
答案 1 :(得分:4)
你在这里要求一个正则表达式,但它不是解析HTML的正确工具。请使用BeautifulSoup。
>>> from bs4 import BeautifulSoup
>>> html = '''
<div id="left-stack">
<span>View In iTunes</span></a>
<span class="price">£19.99</span>
<ul class="list">
<li>HD Version</li>'''
>>> soup = BeautifulSoup(html)
>>> val = soup.find('span', {'class':'price'}).text
>>> print val[1:]
19.99
答案 2 :(得分:2)
你仍然可以使用BeautifulSoup
解析,你不需要完整的HTML:
from bs4 import BeautifulSoup
html="""
<div id="left-stack">
<span>View In iTunes</span></a>
<span class="price">£19.99</span>
<ul class="list">
<li>HD Version</li>
"""
soup = BeautifulSoup(html)
sp = soup.find(attrs={"class":"price"})
print sp.text[1:]
19.99
答案 3 :(得分:2)
目前的BeautifulSoup答案仅显示如何抓取所有<span class="price">
标签。这样更好:
from bs4 import BeautifulSoup
soup = """<div id="left-stack">
<span>View In iTunes</span></a>
<span class="price">£19.99</span>
<ul class="list">
<li>HD Version</li>"""
for HD_Version in (tag for tag in soup('li') if tag.text.lower() == 'hd version'):
price = HD_Version.parent.findPreviousSibling('span', attrs={'class':'price'}).text
通常,使用正则表达式来解析像HTML这样的不规则语言会让人感到麻烦。坚持使用已建立的解析器。
答案 4 :(得分:0)
您可以使用此正则表达式:
\d+(?:\.\d+)?(?=\D+HD Version)
\D+
跳过前瞻中的非数字,有效断言我们的匹配(19.99
)是HD Version
之前的最后一位数。这是regex demo。
使用正则表达式中的i
修饰符使匹配不区分大小写,如果数字可以直接在+
之前,则将*
更改为HD Version
。