正则表达式模式在Python脚本中不起作用

时间:2015-11-17 12:05:25

标签: python regex

我需要在页面列表的HTML中找到特定的单词。我正在使用正则表达式而不是BeautifulSoup,因为我发现它通常更容易。

代码是:

links= ['http://www-01.sil.org/iso639-3/documentation.asp?id=alr','http://www-01.sil.org/iso639-3/documentation.asp?id=ami', ...]
for link in links:
    d = requests.get(link)
    p = re.compile(r'<td valign=\"top\">Name:<\/td>\n\t+<td>\n\t+(\w+)\n\t+<\/td>')
    lang = re.search(p, d.text)

这是d.text

的摘录
<div id="main">
<h1>Documentation for ISO 639 identifier: bnn</h1>
<hr style="margin-bottom: 6pt">

        <table>
            <tr>
                <td valign="top">Identifier:</td>
                <td>bnn</td>
            </tr>

                <tr>
                    <td valign="top">Name:</td>
                    <td>
                    Bunun
                    </td>
                </tr>

            <tr>
                <td valign="top">Status:</td>
                <td>Active</td>
            </tr>

我不知道为什么,但langNone。我在regex101上检查了我的正则表达式模式,也检查了Sublime。我打印了d.text,HTML是正常的:如果我将d.text放在Sublime中并搜索相同的模式,它就可以了。
 我不明白为什么但是这个模式在脚本中不起作用,但在其他地方......我正在使用Python3。我一定是在做傻事,但我不明白是什么......

2 个答案:

答案 0 :(得分:4)

人们应该非常小心'\ n'。文件行可以以'\ n'(Linux样式),'\ r'(MacOS样式)或两者(Windows样式)结束。在您的情况下,您可以轻松更正表达式,接受[\n\r]+代替\n,并且它可以与您的示例链接一起使用:

p = re.compile(r'<td valign="top">Name:</td>[\n\r]+\t+<td>[\n\r]+\t+(\w+)[\n\r]+\t+</td>')

但是,我强烈建议不要依赖文档中的任何间距结构。如果他们改变了怎么办?它不会在现场可见!我认为最好让间距自由。如下所示:

p = re.compile(r'<td valign="top">Name:</td>\s*<td>\s*(\w+)\s*</td>')

还需要注意的是,HTML5中不推荐使用 valign 属性(而是使用CSS),因此它可能在不久的将来完全从文档中消失。

答案 1 :(得分:1)

p = re.compile(r'<td valign="top">Name:</td>\s+<td>\s+(\w+)\s+</td>')

正如@Bryan Oakley所提到的,<td></td>之间有空格,尝试\s+来匹配一个或多个空格。 \s=[ \f\n\r\t\v]

此外,通过使用原始字符串表示法,不需要使用反斜杠来表示特殊形式