【发布时间】:2011-03-02 22:53:24
【问题描述】:
上下文
该案例是使用 QuotaXML SDK 1.6 对 Web 内容进行屏幕抓取,最终在仪表板和 iPhone 上显示数据。
这个 QuotaXML 工具提供了仅用于提取表数据的正则表达式。
QuotaXML 确实使用三步方法解析 html 表。
1.首先识别表,例如使用“(?si)<table.*?>(.*?)</table>”
2. 在这个解析的表中,它识别行的第二个,比如“(?si)<tr.*?>(.*?)</tr>”
3. 在此行范围内的第三个,将单个单元格标识为“(?si)<tr.*?>(.*?)</tr>”
问题
源 html 包含一些不相关的数据行,例如使用 colspan 跨越整个表格宽度的行或图像。
或者表格包含与所需数据线路无关的数据单元格,例如呼叫详细记录,其中还包含未从您的计划中的分钟数中减去的免费电话的呼叫,在本例中为 0800 和 00800 号码。
换句话说,(.*?) 可能不匹配 'colspan="' 和 '>0800' 和 '>00800'。
在代码中:
exclude:<tr><td colspan="2"></td></tr>
include:<tr><td><strong>Date</strong></td><td><strong>Time</strong></td></tr>
exclude:<tr><td>05-01-2011</td><td>08004913</td></tr>
include:<tr><td>05-01-2011</td><td>0123456789</td></tr>
功课完成 即使尝试我的第一个(开始简单)尝试只排除 colspan 都失败了:
(?si)<tr.*?>(?!colspan)(.*?)</tr>(?si)<tr.*?>(.*?)(?!colspan)</tr>(?si)<tr.*?>.*?[^colspan].*?</tr>(?si)<tr(\s[^>]*)?>.*?(?!colspan).*?</tr>(?si)<tr(\s[^>]*)?>.*?(!colspan).*?</tr>(?si)<tr(\s[^>]*)?>(.*?)(?!colspan)</tr>-
(?si)<tr.*?>^(?!.*?colspan=").*?</tr>How to negate specific word in regex? 似乎相关,尽管这些建议根本不匹配。 (?si)<tr.*?>(.(?<!colspan))*?</tr>-
(?si)<tr.*?>(?!.*colspan).*</tr>也不要使用http://www.regular-expressions.info/lookaround.html 提供正面和负面的环顾四周。
我应该如何正确编写这个正则表达式?
【问题讨论】:
-
只是不要用正则表达式解析 HTML:stackoverflow.com/questions/1732348/…
-
我知道我不应该使用正则表达式解析 HTML。正如问题中所解释的,该工具除了使用正则表达式之外没有提供其他选项。