2

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

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

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

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

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

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

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

谢谢。

4

3 回答 3

3

您是否真的对其进行了基准测试并发现 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')
于 2013-07-21T02:29:12.113 回答
2

描述

这个表达式将

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

<meta(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sproperty=(?:'og:image|"og:image"|og:image))(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\scontent=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?:[^'">=]*|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>

在此处输入图像描述

例子

在这个实时示例中,请注意前两个元标记示例文本中的困难边缘情况: 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'"
于 2013-07-21T02:29:33.237 回答
0

使用Scrapy

sel = Selector(response)
fb_description = sel.xpath('//meta[@property="og:description"]/@content').extract()
于 2014-03-05T23:53:15.263 回答