【问题标题】:Python regex to get non http(s) urls from <a> tag from html contentPython 正则表达式从 html 内容中的 <a> 标记获取非 http(s) url
【发布时间】:2018-06-01 10:33:48
【问题描述】:

我正在尝试从锚标记中获取非 http(s) url。如果找到这样的 url,我需要匹配整个锚标记。

示例:

这应该匹配:&lt;a href="example.com/index.html"&gt; bla&lt;/a&gt;

这不应该匹配:&lt;a href="https://www.google.com/"&gt;bla2 &lt;/a&gt;

到目前为止,我已经能够构建这个正则表达式:

(\<a[\s\S]*?)(?<=href)(?:(=[\"\'])|(=))(?!(http[s]?)|(ww[w]?)|(#)|(\/\/))
(?P<url>[\S]*?)(?=([\"\'])|(\s))([\s\S]*?\>)

但这给了我一个匹配,即使是 HTTP。

使用这个正则表达式:(?&lt;=href=[\"\'])(?!(http[s]?)|(ww[w]?))(?P&lt;url&gt;[\S]+)(?=[\"\']) 我只能获取非 http url,但我也需要匹配 &lt;a&gt; 标记的全部内容。

任何建议都会很棒。如果这可以进一步改进,我很高兴。 PS:我不能用beautifulsoup。所以请为我的问题建议一个更好的正则表达式。

【问题讨论】:

  • 你不能用正则表达式解析html:stackoverflow.com/questions/1732348/…
  • 不要使用正则表达式,使用 HTML 解析器。
  • 我知道对 html 使用正则表达式不是一个好主意,但我只能通过使用正则表达式来做到这一点。 HTML 解析器对我帮助不大。任何关于修改正则表达式以获得我需要的建议都会非常有帮助。

标签: python html regex url


【解决方案1】:

这可能有效:

(<a[^>]*href=[\"\'](?!http|ww)(?:\S+)[\"\'][^>]*>)

这将匹配&lt;a href="example.com/index.html"&gt;,如果您需要直到&lt;/a&gt; 之前的所有内容,然后添加例如.*?&lt;/\s*a&gt; 在右括号之前。

说明

  • (?!http|ww):负前瞻,实际上https? 在这里是不必要的,因为(?!http) 已经匹配httphttpswwwww 相同)
  • (?:\S+):网址。这可以改进,因为 URL 中不允许使用许多符号,但目前就足够了。
  • [^&gt;]* a 可能包含其他内容。

【讨论】:

  • 谢谢.. 这几乎可以工作.. 但它不会匹配像 这样的非引用网址有什么办法我也可以匹配这个吗??
  • 也许是(&lt;a[^&gt;]*href=[\"\']?(?!http|ww)(?:\S+?)[\"\']?[^&gt;]*&gt;)。还将 \S+? 更改为与 URL 匹配的模式。
  • 感谢您的宝贵时间,这确实匹配未引用的 url,但它也匹配以 http/www 开头的 url,尽管我们已经写了否定的前瞻。这对我来说也是如此。如果我尝试匹配未引用的 url https 也被匹配.. 如果我尝试使其不匹配 https,即使未引用的 url 也会被错过。
  • 是的,抱歉,我没想到。 (?:h(?!ttp)|w(?!w)|[^wh])\S* 而不是 (?:\S+?) 怎么样?这将匹配不以httpww 开头的字符串。然后是可选的引号和上面的东西。
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2013-04-02
  • 1970-01-01
  • 2011-11-11
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多