【问题标题】:Regular Expression - HTML正则表达式 - HTML
【发布时间】:2015-02-27 02:46:00
【问题描述】:

我对正则表达式有点陌生,但我自己做的那个不起作用。它应该给我来自网站 html 的数据。

我基本上想从 html 和所有多个中得到这个。顺便说一句,我将页面 url 作为字符串。

<a href="http://store.steampowered.com/search/?category2=2" class="name">Co-Op</a>

我为我的正则表达式所做的是:

<a\bhref="http://store.steampowered.com/search/?category2=2"\bclass="name"*>(.*?)</a>\g

【问题讨论】:

  • 使用正则表达式解析 HTML 通常是个坏主意。使用 HTML 解析库或工具会更好

标签: python regex beautifulsoup


【解决方案1】:

您不应该解析 HTML/XML 或任何其他允许使用正则表达式进行级联的语言。

然而,HTML 的一个好处是它可以转换为 XML,并且 XML 有一个很好的解析工具包:

echo '<a href="http://store.steampowered.com/search/?category2=2" class="name">Co-Op</a>' | tidy -asxhtml -numeric 2> /dev/null | xmllint --html --xpath 'normalize-space(//a[@class="name" and @href="http://store.steampowered.com/search/?category2=2"])' - 2>/dev/null

有查询:

normalize-space(//a[@class="name" and @href="http://store.steampowered.com/search/?category2=2"])

// 表示任何标签(不管它的深度),a 表示a 标签,我们还指定了class=namehref=(the link) 的约束。然后我们返回了&lt;a&gt;&lt;/a&gt;这样的标签之间的normalize-space内容。

在 Python 中你可以使用:

import urllib2
from bs4 import BeautifulSoup

page = urllib2.urlopen("http://store.steampowered.com/app/24860/").read()
soup = BeautifulSoup(page)
print soup.find_all('a',attrs={'class':'name','href':'http://store.steampowered.com/search/?category2=2'})

评论你的正则表达式:

问题在于它包含像? 这样的标记,这些标记被解释为正则表达式指令而不是字符。你需要逃离他们。它可能应该是:

<a\s+href="http://store\.steampowered\.com/search/\?category2=2"\s+class="name"\S*>(.*?)</a>\g

我还将\b 替换为\s\s 表示空格字符,如空格、制表符、换行符。尽管正则表达式非常脆弱:如果有人决定交换hrefclass,程序就会出现问题。对于大部分问题,确实有解决方案,但最好使用 XML 分析工具。

【讨论】:

  • 在我看来,正则表达式中的第一个问题是a\bhref 从不匹配任何东西,当然也不是a href。它要求字母 ah 之间的单词边界,如果没有附加字符,它就无法存在。实际上,从头开始,这是第二个问题。我同意第一个问题:用于解析的正则表达式是个坏主意。
  • @JonasRH:那个简单的 linux bash,但也有用于 Python 的 XML 分析器。
  • 嗯,我使用了一个叫做 BeautifulSoup 的东西,一个 html 解析器,但它似乎仍然没有找到任何东西......这就是我尝试使用正则表达式的原因。
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2014-10-01
  • 2011-06-16
相关资源
最近更新 更多