从非均匀选项卡上的html检索字符串

2024-09-30 20:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我要解析的html。在

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

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

^{pr2}$

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


Tags: 数据项目idnumbersource参数htmlserial
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

印刷品:

^{pr2}$

请注意,pyparsing不关心额外的空白落在哪里,它还处理可能在定义的标记、标记内的空白、大写/小写的标记中突然出现的意外属性

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

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

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

但请注意,现在如果有一个新行,它将在您的捕获组中!i、 你应该在结果中去掉空白。在

regex的另一个问题是字符串中的<TD>,但是您要搜索<td>。这里有选项re.I(IgnoreCase)。在

您可以找到有关regex的更多解释here on docs.python.org

相关问题 更多 >