2

我有一个包含一行的 html 文件:

a = '<li><a href="?id=11&amp;sort=&amp;indeks=0,3" class="">H</a></li>'

当我搜索时:

re.findall(r'href="?(\S+)"', a)

我得到预期的输出:

['?id=11&amp;sort=&amp;indeks=0,3']

但是,当我将“i”添加到模式中时,例如:

re.findall(r'href="?i(\S+)"', a)

我得到:

[ ]

问题在哪里?先感谢您。

4

3 回答 3

4

问题是?具有特殊含义并且没有按字面匹配。

要修复,请像这样更改您的正则表达式:

re.findall(r'href="\?i(\S+)"', a)

否则, 将?被视为应用于 的可选修改"。这恰好在您的第一个示例中起作用(偶然),但在第二个示例中不起作用。

于 2012-05-11T14:09:51.767 回答
4

我个人认为 Python 的内置 HTMLParser 对于此类情况非常有用。我认为这根本不是矫枉过正——我认为它比正则表达式更具可读性和可维护性。

>>> class HrefExtractor(HTMLParser.HTMLParser):
...     def handle_starttag(self, tag, attrs):
...         if tag == 'a':
...             attrs = dict(attrs)
...             if 'href' in attrs:
...                 print attrs['href']
... 
>>> he = HrefExtractor()
>>> he.feed('<a href=foofoofoo>')
foofoofoo
于 2012-05-11T14:22:11.690 回答
0

这里要注意的是,它在正?则表达式中具有特殊含义,它定义了任何事物的零次或一次出现。所以,如果你想要<a>标签中的 href 值,你应该使用 -

re.findall(r'href="(\?\S+)"', a)

并不是

re.findall(r'href="?(\S+)"', a)

所以,如果你不使用 ? 的特殊含义,你应该像a 或 b\?一样转义它或使用它。ab?你的使用方式?是不恰当的。

于 2012-05-11T15:13:33.737 回答