2011-05-16 55 views
0

这里是我想解析的html。从非唯一表上的html检索字符串

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

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

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

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

+0

正则表达式是传统的不明智的解决方案来解析HTML。你真的应该使用BeautifulSoup,只要(条件),下降到表中并获取数据。否则,进入下一张桌子。你可以尝试[scrapy](http://scrapy.org/)并使用它来编写一个蜘蛛,它通常包含类似于正则表达式的东西 – inspectorG4dget 2011-05-16 19:27:00

+2

强制性链接:http://stackoverflow.com/questions/1732348/regex- match-open-tags-except-xhtml-self-contained-tags – Amadan 2011-05-16 19:32:21

回答

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不关心其中多余的空格下降,并且还处理在定义的标记中可能出现的意想不到的属性,标记内的空白,大写/小写的标记等。

+0

+1给出了一个关于如何使用解析器的例子,而不仅仅是通常的“使用解析器的html !!!” – stema 2011-05-17 07:49:05

0

在大多数情况下,最好在html上工作使用适当的解析器,但在某些情况下,使用正则表达式完成作业完全可以。我不知道这是否是一个很好的解决方案足够了解你的任务是判断,或者最好是去@保罗的解决方案,但在这里,我尝试修复您的正则表达式:

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