您不应该解析 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=name 和href=(the link) 的约束。然后我们返回了<a>和</a>这样的标签之间的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 表示空格字符,如空格、制表符、换行符。尽管正则表达式非常脆弱:如果有人决定交换href 和class,程序就会出现问题。对于大部分问题,确实有解决方案,但最好使用 XML 分析工具。