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)

それ以外の場合、はに?適用されるオプションの変更として扱われます"。これは、最初の例では(偶然に)機能しますが、2番目の例では機能しません。

于 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

ここでキャッチするのは?、正規表現で特別な意味を持ち、ゼロまたは 1 回の出現を定義することです。したがって、<a>タグから href 値が必要な場合は、- を使用する必要があります。

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

ではない

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

したがって、? の特別な意味を使用していない場合は、a または b のようにエスケープするか、a または b の\?ように使用する必要があります。ab?あなたの使い方は?不適切です。

于 2012-05-11T15:13:33.737 に答える