【问题标题】:Retrieving string from html on non-unique table从非唯一表上的 html 中检索字符串
【发布时间】:2011-08-26 17:00:26
【问题描述】:

这是我要解析的 html。

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

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

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

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

【问题讨论】:

  • Regex 传统上是解析 HTML 的不明智的解决方案。您真的应该使用 BeautifulSoup,当且仅当(条件)下降到表中并获取数据。否则,继续下一张桌子。你可以尝试scrapy 并用它来编写一个蜘蛛,它通常包含类似于正则表达式的东西

标签: python regex html-parsing beautifulsoup urllib


【解决方案1】:

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 举例说明如何使用解析器,而不仅仅是通常的“为 html 使用解析器!!!”
【解决方案2】:

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

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

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

但请注意,现在如果有换行符,它将在您的捕获组中!即,您应该在之后从结果中去除空格。

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

你可以找到更多关于正则表达式here on docs.python.org的解释

【讨论】:

    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多