从非唯一表上的html中检索字符串

时间:2011-05-16 19:21:24

标签: python regex html-parsing beautifulsoup urllib

这是我要解析的html。

<TD>Serial Number</TD><TD>AB12345678</TD>

我正在尝试使用正则表达式来解析数据。我听说过BeautifulSoup,但是页面上有大约50个这样的项目都使用相同的表参数,并且没有一个具有ID号。它们与唯一标识符最接近的是在我需要的数据之前的单元格中的数据。

serialNumber = re.search("Serial Number</td><td>\n(.*?)</td>", source)

Source只是使用urllib抓取的页面的源代码。在第二个和序列号之间的html中有新行,但我不确定这是否重要。

2 个答案:

答案 0 :(得分:2)

Pyparsing可以为您的数据提供更强大的提取器:

from pyparsing import makeHTMLTags, Word, alphanums

htmlfrag = """<blah></blah><TD>Serial Number</TD><TD>
            AB12345678
            </TD><stuff></stuff>"""

td,tdEnd = makeHTMLTags("td")

sernoFormat = (td + "Serial Number" + tdEnd + 
                td + Word(alphanums)('serialNumber') + tdEnd)


for sernoData in sernoFormat.searchString(htmlfrag):
    print sernoData.serialNumber

打印:

AB12345678

请注意,pyparsing并不关心额外空格落在何处,它还处理可能在定义的标记中出现的意外属性,标记内的空格,大写/小写的标记等。

答案 1 :(得分:0)

在大多数情况下,最好使用适当的解析器处理html,但在某些情况下,使用正则表达式完成工作是完全可以的。我不了解您的任务,判断它是否是一个好的解决方案,或者是否更好地使用@Paul的解决方案,但在这里我尝试修复你的正则表达式:

serialNumber = re.search("Serial Number</td><td>(.*?)</td>", source, re.S | re.I )

我删除了\n,因为在我看来很难(\ n,\ r,\ r \ n,...?),而是使用了选项re.S(Dotall)

但要注意,现在如果有换行符,它将出现在你的捕获组中!即你应该从你的结果中删除空格。

正则表达式的另一个问题是字符串中的<TD>,但您搜索的是<td>。其中有选项re.I(IgnoreCase)。

您可以找到有关正则表达式here on docs.python.org

的更多说明