-1

如何从 perl 到 python 执行以下代码块?

while ($content2 =~ m{services</B></TD>\s<TD>\s<TABLE>\s<TR>(.*?)</TABLE>}gs) {
  my $service=$1
  print " service : $1\n";
}

完整的代码有更多的正则表达式输出,但是通过那个例子我可以继续转换。

4

2 回答 2

2

如果我正在正确阅读您的正则表达式,那么您在表格数据单元格中有一个单行(并且没有数据单元格)的表格。你在这里煮什么可憎的东西?

在 python 中,你会为此使用 lxml。它是一个真正的解析器,所以当文档的空格或大小写或其他不相关的结构发生变化时它不会失败。它不是标准库的一部分,但它是 pypi 上安装最多的库之一(如果不是 /the/)。

abominable_html = '''
<html>
<table><tr><td>services</B></TD>
    <TD>
        <TABLE> <TR>Interesting stuff!</TABLE>
'''

from lxml.html import fromstring
doc = fromstring(abominable_html)

# These are equivalent, for demonstration purposes.
print doc.xpath('//table/tr/td/table/tr/text()')[0]
print doc.xpath('//table//table/tr')[0].text

如您所见,它出色地处理了有问题的 html。


如果您需要匹配“服务”文本,您可以添加如下条件:

print doc.xpath('//table[./tr/td="services"]//table/tr')[0].text

这里有一些很好的 xpath 参考:

于 2012-08-02T15:35:05.793 回答
0

我还在学习这个:)

好吧,我基本上是,由 (.*?) 提取的内容是动态值(服务名称),我需要将其插入数据库(在 perl 中我有这个工作)。

我需要的基本上是提取标签之间的内容(这是动态的)

作为下面的示例,使用正则表达式我可以提取服务的名称,以及它是否启用

$content2 =~ m{<TD valign="top"><B>name</B></TD>\s<TD>(.*?)</TD>\s</TR>\s<TR>\s<TD valign="top"><B>enabled</B></TD>\s<TD>(.*?)</TD>}gs
$service=$1
$status=$2

有没有办法使用解析器来做到这一点?如果是,我相信更好的方法是关闭这个问题并打开一个新问题。

于 2012-08-02T18:06:33.633 回答