我需要在页面列表的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>
我不知道为什么,但lang
是None
。我在regex101上检查了我的正则表达式模式,也检查了Sublime。我打印了d.text,HTML是正常的:如果我将d.text
放在Sublime中并搜索相同的模式,它就可以了。
我不明白为什么但是这个模式在脚本中不起作用,但在其他地方......我正在使用Python3。我一定是在做傻事,但我不明白是什么......
答案 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]
此外,通过使用原始字符串表示法,不需要使用反斜杠来表示特殊形式