Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

aタグ内の文字列を検索して部分一致するものを取得する。

実現したいこと:
<a href>に特定の文字列(AAAA)を含むリンクを選んでリンク先にある<a href=リンク</a>ファイル(IV2000AAAA01.DAT)をダウンロードしたいです。

<tr class="odd"><td class="first"><span class="bold_link"><a href="/cgi-bin/download.cgi?DFIL=EDA-000000-000001-154496">IV2000AAAA01.DAT</a></span></td><td nowrap>2020-08-20 20:13:14</td><td nowrap>2020-08-27 20:13:14</td><td> </td></tr>
以下に同じような<tr class="odd"> リンク先 </tr>が続きます。

知りたいこと:
特定の文字列を検索する方法(完全一致、部分一致)がわかりませんので、教えていただければ助かります。

0

2Answer

正規表現でr'(?<=<a href=")[^"]+(?=">[^<]*AAAA[^<]*</a>)'を検索すればURLを取り出せると思います。
aタグに他の属性があったりするともっと複雑に。

1Like

Comments

  1. @takaekokaz

    Questioner

    ありがとうございます。
    正規表現を使用するとかなりややこしいですね。

    import re
    検索url = re.compile(r'(?<=<a href=")[^"]+(?=">[^<]*AAAA[^<]*</a>)')
    soup.find(text=検索url)

    のようにすればよいですか?
    (現在外出中でpythonが使用できず、想像で書いております。)


  2. pythonはほとんどいじったことないですが、解説などを読むとどうやら違うようです。
    `文字列.find(...)`は正規表現じゃない単純な文字列検索です。

    ```python
    import re
    for match in re.findall(r'(?<=<a href=")[^"]+(?=">[^<]*AAAA[^<]*</a>)', 検索対象HTML)
    print(match)
    ````

    `re.compile`は同じ検索パターンを何度も使うときに毎回検索パターンを作らず再利用するための高速化の手段でしかないので、よっぽど多くのHTMLテキストからすべて抜き出すとかでなければ使う必要はありません。

    ちなみに
    検索したい文字列の前にある文字列: `<a href="`
    検索したい文字列本体: `[^"]+`
    検索したい文字列の後にある文字列: `">[^<]*AAAA[^<]*</a>`
    と分けて考えるとなにをしているのか理解しやすいと思います。

    返信はmarkdownじゃないのか!
    まあわかると思いますが、printの行はインデントされてます。
  3. (ずっこけた)
    Seleniumで取り込んでるなら、そりゃあそっちの方で便利な機能を用意してくれてますねw

Seleniumで解決したようですが、もともと Beautiful Soup を使っていたようなので、単純な解決方法は↓でしょうか。

soup.find_all(href=re.compile("AAAA"))
1Like

Comments

  1. @takaekokaz

    Questioner

    ありがとうございます。
    こちらも是非参考にさせていただきます。

Your answer might help someone💌