【问题标题】:Regex in python that finds the attribute of some HTML tag?python中的正则表达式找到一些HTML标签的属性?
【发布时间】:2013-07-20 01:26:24
【问题描述】:

我一直在尝试生成一个有效的正则表达式来查找 html 标签的属性 现在有一段时间了,但他们似乎都以某种方式失败了。

使用正则表达式是因为加载 beautifulsoup 需要很长时间才能检查一个 html 标签。

这是需要检查的标签/属性的示例:

<meta content="http://domain.com/path/path/file.jpg" rnd_attr="blah blah"      
   property="og:image"/>

正则表达式如何在确保标签为“og:image”的同时检索此标签的内容。

对不起,如果这个问题有点幼稚,或者生成正则表达式完全不可行。

奖励:除了 BeautifulSoup,python 中还有哪些其他快速/有效的 DOM 解析器替代方案?

谢谢。

【问题讨论】:

  • 最好的方法似乎是使用 lxml 和他的 XPath 功能,而不是 BeautifulSoup 或正则表达式。
  • 啊,好吧,我想一个后续问题是:如果 lxml 更快,为什么 BeautifulSoup 如此受欢迎/广泛使用?是不是功能少了?
  • 困难的部分是试图弄清楚你到底想要完成什么。请尝试更清晰,更具体。 “此标签的内容”是指 content 属性的值还是标签中的所有内容? “确保标签属于 og:image”是指它有一个值为“og:image”的 property 属性吗?正则表达式是一次检查一个标签,还是检索页面中符合条件的所有标签的“内容”?
  • 并不是说生成正则表达式很困难,只是正则表达式会非常复杂,并且仍然无法针对每种情况正确解析 HTML。正则表达式是从任意 HTML 解析和提取数据的错误工具。

标签: python regex beautifulsoup


【解决方案1】:

您是否真的对其进行了基准测试并发现 BeautifulSoup 是瓶颈?

content = soup.find('meta', property='og:image').get('content')

你也可以使用lxml,这样更快:

import lxml.html

root = lxml.html.fromstring(html)  # Use .parse() on a file-like object instead

content = root.xpath('/html/head/meta[@property="og:image"][1]/@content')

【讨论】:

  • 感谢重新整理 lxml。如果它快得多,为什么BS如此受欢迎?是因为功能少吗?
  • @LucasOu-Yang 在我看来,我使用 BeautifulSoup 是因为它的语法非常简单。
  • @LucasOu-Yang:更容易使用。
【解决方案2】:

说明

这个表达式会

  • 找到具有property="og:image"属性的元标记
  • 避免一些非常困难的边缘情况
  • 捕获内容属性的值
  • 允许属性以任意顺序出现

&lt;meta(?=\s|&gt;)(?=(?:[^&gt;=]|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*?\sproperty=(?:'og:image|"og:image"|og:image))(?=(?:[^&gt;=]|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*?\scontent=('[^']*'|"[^"]*"|[^'"][^\s&gt;]*))(?:[^'"&gt;=]*|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*&gt;

示例

在这个实例中,请注意前两个元标记示例文本中的困难边缘情况:http://www.rubular.com/r/YY70uaGPLE

示例文本

<meta info=' content="DontFindMe" ' content="http://domain.com/path/path/file1.jpg" random_attr="blah blah"      
   property="og:image"/>
<meta content="http://domain.com/path/path/file2.jpg" random_attr="blah blah"      
   property="og:image"/>
<meta random_attr="blah blah"   property='og:image' content="foo'"   />

匹配项

[0][0] = <meta info=' content="DontFindMe" ' content="http://domain.com/path/path/file1.jpg" random_attr="blah blah"      
   property="og:image"/>
[0][1] = "http://domain.com/path/path/file1.jpg"


[1][0] = <meta content="http://domain.com/path/path/file2.jpg" random_attr="blah blah"      
   property="og:image"/>
[1][1] = "http://domain.com/path/path/file2.jpg"


[2][0] = <meta random_attr="blah blah"   property='og:image' content="foo'"   />
[2][1] = "foo'"

【讨论】:

  • 由于property 的单引号属性和content 中的单引号,它无法处理&lt;meta property='og:image' content="foo'" /&gt;
  • @Blender,再看一遍。
  • @Denomales:但现在它与属性值周围的引号匹配。
  • 是的,它以前也这样做过。
【解决方案3】:

Scrapy:

sel = Selector(response)
fb_description = sel.xpath('//meta[@property="og:description"]/@content').extract()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2014-09-27
    • 2013-06-18
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多