2016-12-15 7 views
-1

私は正規表現に新しいブランドだし、私は次の二つの問題を解決しようとしています:すべてのリンクを抽出する正規表現と対応するリンクは、テキスト

  1. がすべて抽出する正規表現を書きますリンク、および対応するリンクテキストをHTMLページから取得します。たとえば、あなたが望んでいた場合は解析する:

    text1 <a href="http://example.com">hello, world</a> text2 
    

をして結果を得る

http://example.com <tab> hello, world 
  • 同じことを行いますが、また、取り扱いの場合ここで、

      は、 <は...>ネストされています:

      text1 <a href="http://example.com" onclick="javascript:alert('<b>text2</b>')">hello, world</a> text3 
      

    これまでのところ私はまだ最初の質問に就いています。私は最初の私の最高の答えは、私を与える(?<=a href=\")(.*)(?=</a>)http://example.com">hello, world

    これは私には十分だと思われるが、私はどのように私は2番目の部分に近づくと思いますかわからない。助けや洞察力があれば大いに感謝します。あなたはHTMLパーサBeautifulSoupなどでそれを解決した場合

  • +1

    正規表現が悪いです。あなたは本当のhtmlパーサを考慮する必要があります。 –

    +0

    http://stackoverflow.com/a/1732454/6779307 –

    +0

    質問にはどうすればいいですか?ちょうどhtmlの解析のための正規表現はありません? –

    答えて

    1

    、それは単に要素のテキストを取得するための辞書のようなhref属性へのアクセスとget_text()を使用して、a要素を見つけるに降りてくるでしょう:

    In [1]: from bs4 import BeautifulSoup 
    
    In [2]: l = [ 
        """text1 <a href="http://example.com">hello, world</a> text2""", 
        """text1 <a href="http://example.com" onclick="javascript:alert('<b>text2</b>')">hello, world</a> text3""" 
    ] 
    
    In [3]: for s in l: 
          soup = BeautifulSoup(s, "html.parser") 
          link = soup.a 
          print(link["href"] + "\t" + link.get_text()) 
        ...:  
    http://example.com hello, world 
    http://example.com hello, world 
    
    1

    あなたが言及したので、正規表現

    import re 
    
    line1 = "text1 <a href=”http://example.com”>hello, world</a> text2" 
    line2 = "text1 <a href=”http://example.com” onclick=”javascript:alert(‘<b>text2</b>’)”>hello, world</a> text3" 
    
    
    link1 = re.search("<. href=(.*)<\/.>",line1) 
    print(link1.group(1)) 
    link2 = re.search("<. href=(.*)<\/.>",line2) 
    print(link2.group(1)) 
    

    出力

    ”http://example.com”>hello, world 
    ”http://example.com” onclick=”javascript:alert(‘<b>text2</b>’)”>hello, world 
    
    1

    正規表現では、取得する必要があるものよりも、取得する必要があるものを見ている方がよい場合もあります。これは、印刷されます

    #!perl 
    
    use strict; 
    use warnings; 
    
    my $sample = q{text1 <a href="http://example.com">hello, world</a> text2}; 
    
    my ($link, $link_text) = $sample =~ m{<a href="([^"]*)"[^>]*>(.*?)</a>}; 
    
    print "$link \t $link_text\n"; 
    
    1; 
    

    :それはやっているものを打破するには

    http://example.com <tab> hello, world 
    

    最初のキャプチャ、([^"]*)を探している。このPerlの正規表現は、確実に、単純なリンクとその関連テキストをキャプチャする必要があります二重引用符ではないhref属性の中の0文字以上。角括弧は文字の範囲を示すために使用され、先頭のカラットは正規表現にこの範囲にない文字を探すよう指示します。

    同様に、aタグの閉じ括弧を見つけるには、[^>]*>を使用します。他の属性がタグに含まれている可能性について心配する必要はありません。

    最後に、(.*?)は、そのリンク内のすべてのテキストをキャプチャする0以上の非貪欲型キャプチャ(疑問符で表示)です。貪欲でないインジケータがなければ、ドキュメント内の最後の最後の</a>タグまでのすべてのテキストが一致します。

    これは、割り当てのパート2を解決するのに役立ちます。 :)

    関連する問題