Web ページを解析してすべての href リンクを抽出するにはどうすればよいでしょうか?
質問
Groovy で Web ページを解析し、すべての href リンクとそれに関連付けられたテキストを抽出したいと考えています。
ページに次のリンクが含まれている場合:
<a href="http://www.google.com">Google</a><br />
<a href="http://www.apple.com">Apple</a>
出力は次のようになります:
Google, http://www.google.com<br />
Apple, http://www.apple.com
素晴らしい答えを探しています。別名。簡単な方法!
解決
整形式の XHTML を想定して、XML を読み取ってすべてのタグを収集し、「a」タグを見つけて、href とテキストを出力します。
input = """<html><body>
<a href = "http://www.hjsoft.com/">John</a>
<a href = "http://www.google.com/">Google</a>
<a href = "http://www.stackoverflow.com/">StackOverflow</a>
</body></html>"""
doc = new XmlSlurper().parseText(input)
doc.depthFirst().collect { it }.findAll { it.name() == "a" }.each {
println "${it.text()}, ${it.@href.text()}"
}
他のヒント
グーグルで簡単に検索すると、良さそうな可能性が見つかりました。 タグスープ.
私は Java については知りませんが、1 つ (または複数) の HTML 要素を取得するには、古典的な正規表現よりも xpath の方がはるかに優れていると思います。
書きやすく読みやすくもなります。
<html>
<body>
<a href="1.html">1</a>
<a href="2.html">2</a>
<a href="3.html">3</a>
</body>
</html>
上記の HTML では、この式「/html/body/a」により、すべての href 要素がリストされます。
ここにステップバイステップのチュートリアルがあります http://www.zvon.org/xxl/XPathTutorial/General/examples.html
XMLSlurper を使用して HTML を XML ドキュメントとして解析し、適切なクロージャを指定した find メソッドを使用して a タグを選択し、GPathResult の list メソッドを使用してタグのリストを取得します。これで、GPathResult の子としてテキストを抽出できるようになります。
正規表現を試してください。次のようなものが機能するはずです。
(html =~ /<a.*href='(.*?)'.*>(.*?)<\/a>/).each { url, text ->
// do something with url and text
}
を見てみましょう Groovy - チュートリアル 4 - 正規表現の基礎 そして アンカータグの正規表現の破壊.
XMlSlurper を使用した解析は、HTMl が整形式の場合にのみ機能します。
HTMl ページに整形式ではないタグがある場合は、ページの解析に正規表現を使用します。
元: <a href="www.google.com">
ここで、「a」は閉じていないため、適切な形式ではありません。
new URL(url).eachLine{
(it =~ /.*<A HREF="(.*?)">/).each{
// process hrefs
}
}
HTMLパーサー +正規表現では、あらゆる言語がそれを行うことができますが、Perlが最速のソリューションだと思います。