0

我正在尝试http://xyz.com/5从下面的字符串中提取链接。您可以看到,只有我们拥有该class="next"属性。所以我试图根据这个属性来获得它。

<a href='http://xyz.com/1' class='page larger'>2</a>
<a href='http://xyz.com/2' class='page larger'>3</a>
<a href='http://xyz.com/3' class='page larger'>4</a>
<a href='http://xyz.com/4' class='page larger'>5</a>
<a href='http://xyz.com/5' class="next">»</a>

我尝试了以下模式,但这会返回整个文本中的所有链接。

<a href='(.+?)' class="next">

(我从这个站点了解到使用正则表达式解析 HTML 是一个坏主意,但我现在必须这样做。)

4

2 回答 2

2

请不要使用正则表达式来解析 HTML。使用类似的东西BeautifulSoup。它更容易更好:p

from bs4 import BeautifulSoup as BS
html = """<a href='http://xyz.com/1' class='page larger'>2</a>
<a href='http://xyz.com/2' class='page larger'>3</a>
<a href='http://xyz.com/3' class='page larger'>4</a>
<a href='http://xyz.com/4' class='page larger'>5</a>
<a href='http://xyz.com/5' class="next">»</a>"""
soup = BS(html)
for atag in soup.find_all('a', {'class':'next'}):
    print atag['href']

以您的示例为例,将打印:

http://xyz.com/5

此外,您的正则表达式工作正常

于 2013-06-30T02:21:05.957 回答
2

试试这个正则表达式:

<a href='([^']+)' class="next">

使正则表达式不贪婪并不意味着它总是会找到最短的匹配。这只是意味着一旦找到匹配项,它将返回它,它不会继续寻找更长的匹配项。换句话说,它将使用通配符右侧的最短匹配,而不是左侧。

因此,您的正则表达式在第一个链接的开头匹配,并一直持续到找到class = "next". .+?using表示通配符不会跨越属性边界,而不是 using [^']+,因此您可以确保只匹配一个链接。

于 2013-06-30T02:27:17.820 回答