웹페이지를 어떻게 구문 분석하고 모든 href 링크를 추출합니까?
문제
Groovy에서 웹페이지를 구문 분석하고 모든 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
Groovy 답변을 찾고 있습니다.일명.쉬운 방법!
해결책
올바른 형식의 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()}"
}
다른 팁
빠른 Google 검색으로 멋진 가능성이 발견되었습니다. 태그수프.
나는 Java를 모르지만 하나 이상의 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 메소드를 사용하여 태그를 선택한 다음 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 Parser + 정규식 모든 언어는이를 수행 할 수 있지만 Perl이 가장 빠른 솔루션이라고 말합니다.