回到我已发布的相同HTML内容。试着学习一点RegEx,即使我知道还有其他方法。我不是傻瓜,就像挑战一样......
我的表达是:
publisher.php\?c=.*?\">(.*?)</a>(?:.*?)<br\s\\>(?:[\s\r\n]*?)Date:\s<time\sdatetime="(.*?)\">(?:.*?)(?:[\s\r\n]*?)Pages:\s*?(\d*?)<br\s\\>
匹配内容:
<p>Country: <a href="country.php?c=it">Italy</a><br \>
Publication: <a href="publication.php?c=it/TL">Topolino (libretto)</a></p>
Publisher: <a href="publisher.php?c=Mondadori">Mondadori</a><br><br \>
Date: <time datetime="1970-11-22">November 22, 1970</time><br \>
Pages: 196<br \>
Price: 150 Lit. <br \>
<span class="indexedBy">Index delivered by: <a href="mag-inx.php?c=ABo">ABo</a></span>
如果我在Expresso中测试它,工作正常,但是当我在Python中运行时,我的结果是没有立即为组1 ...
有任何线索吗?
谢谢,
中号
答案 0 :(得分:2)
regexp的所有实现都有细微差别。它在expresso中工作并不意味着它在Python中有效。它也可能是一个有不同标志默认值的问题,比如空格等等。
除非案例很简单,否则请勿使用regexp来匹配HTML或XML。使用针对HTML / XML制作的库,例如lxml或BeautifulSoup。
你的正则表达式是巨大的,我只是想着弄清楚它的工作原理让我头疼。见2.
执行此操作时:\\>
您创建一个反斜杠并且大于括号。正则表达式将此解释为文字括号。您需要三个反斜杠:\\\>
或更好:使用原始字符串,即使用r''而不是''。
使用BeautifulSoup。真。
答案 1 :(得分:0)
你是如何在Python中运行它的?你是以原始字符串形式逃脱的吗?你添加了多行标志吗?
您正在以可能导致问题的方式混合双引号,单引号和反斜杠。例如,这个位看起来很奇怪:
c=.*?\">
但在Linux x86上使用Python 2.6.6似乎对我有用。
$ cat expresso.py
import re
str = r'''<p>Country: <a href="country.php?c=it">Italy</a><br \>
Publication: <a href="publication.php?c=it/TL">Topolino (libretto)</a></p>
Publisher: <a href="publisher.php?c=Mondadori">Mondadori</a><br><br \>
Date: <time datetime="1970-11-22">November 22, 1970</time><br \>
Pages: 196<br \>
Price: 150 Lit. <br \>
<span class="indexedBy">Index delivered by: <a href="mag-inx.php?c=ABo">ABo</a></span>'''
pat = r'publisher.php\?c=.*?\">(.*?)</a>(?:.*?)<br\s\\>(?:[\s\r\n]*?)Date:\s<time\sdatetime="(.*?)\">(?:.*?)(?:[\s\r\n]*?)Pages:\s*?(\d*?)<br\s\\>'
res = re.search(pat, str, re.MULTILINE)
print res.groups()
$ python expresso.py
('Mondadori', '1970-11-22', '196')