html标签内的正则表达式

时间:2014-09-11 23:03:06

标签: python html regex html-parsing

我想从下面的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”?

5 个答案:

答案 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