我已经有一个函数,该函数从给定标记页面上的所有href
标签中检索a
属性。但是,我还想检索其他属性,即title
属性。
我感觉这是对我已经在使用的正则表达式的简单修改,但是我唯一关心的是标记中出现的顺序。如果我有此代码的链接:
<a href="somepage.html" title="My Page">link text</a>
我希望它被解析为相同的,即使看起来像这样也不会引起任何错误:
<a title="My Page" href="somepage.html">link text</a>
这是我的处理功能:
function getLinks($src) {
if(preg_match_all('/<a\s+href=["\']([^"\']+)["\']/i', $src, $links, PREG_PATTERN_ORDER))
return array_unique($links[1]);
return false;
}
我是否必须一起使用另一个正则表达式,还是可以修改此正则表达式,以便将title
属性与href
属性存储在相同的返回数据数组中?
您可以在该正则表达式上构建。看看:
'/<a(?:\s+(?:href=["\'](?P<href>[^"\'<>]+)["\']|title=["\'](?P<title>[^"\'<>]+)["\']|\w+=["\'][^"\'<>]+["\']))+/i'
...或人类可读形式:
preg_match_all(
'/<a
(?:\s+
(?:
href=["\'](?P<href>[^"\'<>]+)["\']
|
title=["\'](?P<title>[^"\'<>]+)["\']
|
\w+=["\'][^"\'<>]+["\']
)
)+/ix',
$subject, $result, PREG_PATTERN_ORDER);
我想,这很自我解释。请注意,原始的正则表达式在外观上存在相同的问题。例如,它将无法匹配该标签:
<a class="someclass" href="somepage.html">link text</a>
除非您完全确定没有其他属性,否则您不能合理地期望href
列在第一位。您可以使用与上述相同的头,其中第二个分支以静默方式使用并丢弃您不感兴趣的属性:
'/<a
(?:\s+
(?:
href=["\'](?P<href>[^"\'<>]+)["\']
|
\w+=["\'][^"\'<>]+["\']
)
)+/ix',
尝试一下我刚回来的regextrainer。>>
该示例包含如下模式:<([^ ]+) ?([^>]*)>([^<]*)< ?/ ?\1>
,它将捕获html中的属性。
我现在看到它不提取属性名称和值,而只是提取整个属性文本本身。使用它来提取属性详细信息:((([^=]+)=((?:"|'))([^"']+)\4) ?)+
您可以使用beautifulsoup的select()方法找到目标标签,然后使用element.attrs获取保存在字典中的标签的所有属性。