{"repo":"jhy/jsoup","free":true,"listed":false,"github":"https://github.com/jhy/jsoup","clone":"git clone https://github.com/jhy/jsoup.git","description":"jsoup: the Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety.","language":"Java","stars":11387,"topics":["css","css-selectors","dom","html","java","java-html-parser","jsoup","parser","web-scraping","xml","xpath"],"license":"MIT","category":"web_scraping_api","readme_excerpt":"# jsoup: Java HTML Parser\n\n**jsoup** is a Java library that makes it easy to work with real-world HTML and XML. It offers an easy-to-use API for URL fetching, data parsing, extraction, and manipulation using DOM API methods, CSS, and xpath selectors.\n\n**jsoup** implements the [WHATWG HTML5](https://html.spec.whatwg.org/multipage/syntax.html) specification, and parses HTML to the same DOM as modern browsers.\n\n- [Scrape and parse HTML](https://jsoup.org/cookbook/input/parse-document-from-string) from a URL, file, or string.\n- [Find and extract data](https://jsoup.org/cookbook/extracting-data/selector-syntax) using DOM traversal or CSS selectors.\n- [Manipulate HTML elements](https://jsoup.org/cookbook/modifying-data/set-html), attributes, and text.\n- [Clean user-submitted content](https://jsoup.org/cookbook/cleaning-html/safelist-sanitizer) against a safelist to prevent XSS attacks.\n- [Output tidy HTML](https://jsoup.org/apidocs/org/jsoup/nodes/Element.html#html()).\n\njsoup is designed to deal with all varieties of HTML found in the wild; from pristine and validating, to invalid tag-soup; jsoup will create a sensible parse tree.\n\nSee [**jsoup.org**](https://jsoup.org/) for downloads and the full [API documentation](https://jsoup.org/apidocs/).\n\n[![Build Status](https://github.com/jhy/jsoup/workflows/Build/badge.svg)](https://github.com/jhy/jsoup/actions?query=workflow%3ABuild)\n\n## Example\nFetch the [Wikipedia homepage](https://en.wikipedia.org/wiki/Main_Page), parse it to a [DOM](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction), and select the headlines from the *In the news* section into a list of [Elements](https://jsoup.org/apidocs/org/jsoup/select/Elements.html) ([online sample](https://try.jsoup.org/~LGB7rk_atM2roavV0d-czMt3J_g), [full source](https://github.com/jhy/jsoup/blob/master/src/main/java/org/jsoup/examples/Wikipedia.java)):\n\n```java\nDocument doc = Jsoup.connect(\"https://en.wikipedia.org/\").get();\nlog(doc.title());\nElements newsHeadlines = doc.select(\"#mp-itn b a\");\nfor (Element headline : newsHeadlines) {\n    log(\"%s\\n\\t%s\",\n        headline.attr(\"title\"), headline.absUrl(\"href\"));\n}\n```\n\n## Open Source\njsoup is an open source project distributed under the liberal [MIT license](https://jsoup.org/license). The source code is available on [GitHub](https://github.com/jhy/jsoup).\n\n## Getting Started\n1. [**Download**](https://jsoup.org/download) the [latest](https://github.com/jhy/jsoup/releases/tag/jsoup-1.23.1) jsoup jar (or add it to your Maven/Gradle build)\n2. Read the [cookbook introduction](https://jsoup.org/cookbook/introduction/parsing-a-document).\n3. Enjoy!\n\nMaven:\n\n```xml\n<dependency>\n  <!-- jsoup HTML parser library @ https://jsoup.org/ -->\n  <groupId>org.jsoup</groupId>\n  <artifactId>jsoup</artifactId>\n  <version>1.23.1</version>\n</dependency>\n```\n\nGradle:\n\n```groovy\n// jsoup HTML parser library @ https://jsoup.org/\nimplementation 'org.jsoup:jsoup:1.23.1'\n```\n\n### Android Support\nWhen used in Android projects, [core library desugaring](https://developer.android.com/studio/write/java8-support#library-desugaring) with the [NIO specification](https://developer.android.com/studio/write/java11-nio-support-table) should be enabled to support Java 8+ features.\n\n## Development and Support\nIf you have any questions on how to use jsoup or have ideas for future development, please get in touch via [jsoup Discussions](https://github.com/jhy/jsoup/discussions).\n\nIf you find any issues, please file a [bug](https://jsoup.org/bugs) after checking for duplicates.\n\nThe [colophon](https://jsoup.org/colophon) talks about the history of and tools used to build jsoup.\n\n## Status\njsoup is in general, stable release.\n\n## Author\njsoup was created and is maintained by [Jonathan Hedley](//jhedley.com), its primary author.\n\njsoup is an open-source project, and many contributors have helped improve it over the years. You can see their contributions and join the development on [GitHub](https://github.com/jhy/jsoup/graphs/contributors).\n\n## Citing jsoup\nIf you use jsoup in research or technical documentation, you can cite it as:\n\n> **Jonathan Hedley & jsoup contributors. jsoup: Java HTML Parser (2009–present).** Available at: https://jsoup.org\n\n```plaintext\n@misc{jsoup,\n  author = {Jonathan Hedley and jsoup contributors},\n  title = {jsoup: Java HTML Parser},\n  year = {2026},\n  url = {https://jsoup.org}\n}\n```\n","default_branch":"master","files":309,"tree":[".gitattributes",".github/CONTRIBUTING.md",".github/FUNDING.yml",".github/dependabot.yml",".github/workflows/build.yml",".github/workflows/cifuzz.yml",".github/workflows/codeql.yml",".gitignore","CHANGES.md","LICENSE","README.md","SECURITY.md","change-archive.txt","pom.xml","src/main/java/org/jsoup/Connection.java","src/main/java/org/jsoup/HttpStatusException.java","src/main/java/org/jsoup/Jsoup.java","src/main/java/org/jsoup/Progress.java","src/main/java/org/jsoup/SerializationException.java","src/main/java/org/jsoup/UnsupportedMimeTypeException.java","src/main/java/org/jsoup/examples/HtmlToPlainText.java","src/main/java/org/jsoup/examples/ListLinks.java","src/main/java/org/jsoup/examples/Wikipedia.java","src/main/java/org/jsoup/examples/package-info.java","src/main/java/org/jsoup/helper/AuthenticationHandler.java","src/main/java/org/jsoup/helper/CookieUtil.java","src/main/java/org/jsoup/helper/DataUtil.java","src/main/java/org/jsoup/helper/HttpConnection.java","src/main/java/org/jsoup/helper/Re2jRegex.java","src/main/java/org/jsoup/helper/Regex.java","src/main/java/org/jsoup/helper/RequestAuthenticator.java","src/main/java/org/jsoup/helper/RequestDispatch.java","src/main/java/org/jsoup/helper/RequestExecutor.java","src/main/java/org/jsoup/helper/UrlBuilder.java","src/main/java/org/jsoup/helper/UrlConnectionExecutor.java","src/main/java/org/jsoup/helper/Validate.java","src/main/java/org/jsoup/helper/ValidationException.java","src/main/java/org/jsoup/helper/W3CDom.java","src/main/java/org/jsoup/helper/package-info.java","src/main/java/org/jsoup/internal/ControllableInputStream.java","src/main/java/org/jsoup/internal/Functions.java","src/main/java/org/jsoup/internal/LineMap.java","src/main/java/org/jsoup/internal/NamespaceBindings.java","src/main/java/org/jsoup/internal/Normalizer.java","src/main/java/org/jsoup/internal/QuietAppendable.java","src/main/java/org/jsoup/internal/SharedConstants.java","src/main/java/org/jsoup/internal/SimpleBufferedInput.java","src/main/java/org/jsoup/internal/SimpleStreamReader.java","src/main/java/org/jsoup/internal/SoftPool.java","src/main/java/org/jsoup/internal/StringUtil.java","src/main/java/org/jsoup/internal/package-info.java","src/main/java/org/jsoup/nodes/Attribute.java","src/main/java/org/jsoup/nodes/Attributes.java","src/main/java/org/jsoup/nodes/CDataNode.java","src/main/java/org/jsoup/nodes/Comment.java","src/main/java/org/jsoup/nodes/DataNode.java","src/main/java/org/jsoup/nodes/Document.java","src/main/java/org/jsoup/nodes/DocumentType.java","src/main/java/org/jsoup/nodes/Element.java","src/main/java/org/jsoup/nodes/Entities.java","src/main/java/org/jsoup/nodes/EntitiesData.java","src/main/java/org/jsoup/nodes/FormElement.java","src/main/java/org/jsoup/nodes/LeafNode.java","src/main/java/org/jsoup/nodes/Node.java","src/main/java/org/jsoup/nodes/NodeInternals.java","src/main/java/org/jsoup/nodes/NodeIterator.java","src/main/java/org/jsoup/nodes/NodeUtils.java","src/main/java/org/jsoup/nodes/Printer.java","src/main/java/org/jsoup/nodes/PseudoTextElement.java","src/main/java/org/jsoup/nodes/Range.java","src/main/java/org/jsoup/nodes/TextNode.java","src/main/java/org/jsoup/nodes/XmlDeclaration.java","src/main/java/org/jsoup/nodes/package-info.java","src/main/java/org/jsoup/package-info.java","src/main/java/org/jsoup/parser/CharacterReader.java","src/main/java/org/jsoup/parser/HtmlTagOptions.java","src/main/java/org/jsoup/parser/HtmlTreeBuilder.java","src/main/java/org/jsoup/parser/HtmlTreeBuilderState.java","src/main/java/org/jsoup/parser/ParseError.java","src/main/java/org/jsoup/parser/ParseErrorList.java","src/main/java/org/jsoup/parser/ParseSettings.java","src/main/java/org/jsoup/parser/Parser.java","src/main/java/org/jsoup/parser/StreamParser.java","src/main/java/org/jsoup/parser/Tag.java","src/main/java/org/jsoup/parser/TagSet.java","src/main/java/org/jsoup/parser/Token.java","src/main/java/org/jsoup/parser/TokenData.java","src/main/java/org/jsoup/parser/TokenQueue.java","src/main/java/org/jsoup/parser/Tokeniser.java","src/main/java/org/jsoup/parser/TokeniserState.java","src/main/java/org/jsoup/parser/TreeBuilder.java","src/main/java/org/jsoup/parser/XmlTreeBuilder.java","src/main/java/org/jsoup/parser/package-info.java","src/main/java/org/jsoup/safety/Cleaner.java","src/main/java/org/jsoup/safety/Safelist.java","src/main/java/org/jsoup/safety/package-info.java","src/main/java/org/jsoup/select/Collector.java","src/main/java/org/jsoup/select/CombiningEvaluator.java","src/main/java/org/jsoup/select/Elements.java","src/main/java/org/jsoup/select/Evaluator.java","src/main/java/org/jsoup/select/NodeEvaluator.java","src/main/java/org/jsoup/select/NodeFilter.java","src/main/java/org/jsoup/select/NodeTraversor.java","src/main/java/org/jsoup/select/NodeVisitor.java","src/main/java/org/jsoup/select/Nodes.java","src/main/java/org/jsoup/select/QueryParser.java","src/main/java/org/jsoup/select/Selector.java","src/main/java/org/jsoup/select/StructuralEvaluator.java","src/main/java/org/jsoup/select/package-info.java","src/main/java11/module-info.java","src/main/java11/org/jsoup/helper/HttpClientExecutor.java","src/main/java11/org/jsoup/helper/RequestAuthHandler.java","src/main/javadoc/overview.html","src/main/resources/META-INF/proguard/org.jsoup_jsoup.pro","src/test/java/org/jsoup/JsoupTest.java","src/test/java/org/jsoup/MultiLocaleExtension.java","src/test/java/org/jsoup/SerializationExceptionTest.java","src/test/java/org/jsoup/TextUtil.java","src/test/java/org/jsoup/helper/AuthenticationHandlerTest.java","src/test/java/org/jsoup/helper/CookieUtilTest.java","src/test/java/org/jsoup/helper/DataUtilTest.java","src/test/java/org/jsoup/helper/HttpConnectionTest.java","src/test/java/org/jsoup/helper/RegexTest.java","src/test/java/org/jsoup/helper/ValidateTest.java","src/test/java/org/jsoup/helper/W3CDomTest.java","src/test/java/org/jsoup/integration/Benchmark.java","src/test/java/org/jsoup/integration/ConnectIT.java","src/test/java/org/jsoup/integration/ConnectTest.java","src/test/java/org/jsoup/integration/FuzzFixesTest.java","src/test/java/org/jsoup/integration/ParseTest.java","src/test/java/org/jsoup/integration/ParserSoakIT.java","src/test/java/org/jsoup/integration/ProxyTest.java","src/test/java/org/jsoup/integration/SafelistExtensionTest.java","src/test/java/org/jsoup/integration/SessionIT.java","src/test/java/org/jsoup/integration/SessionTest.java","src/test/java/org/jsoup/integration/TestAuth.java","src/test/java/org/jsoup/integration/TestServer.java","src/test/java/org/jsoup/integration/TestTls.java","src/test/java/org/jsoup/integration/netty/NettyProxyServer.java","src/test/java/org/jsoup/integration/netty/NettySupport.java","src/test/java/org/jsoup/integration/netty/NettyTestServer.java","src/test/java/org/jsoup/integration/netty/RawResponseWriter.java","src/test/java/org/jsoup/integration/netty/RouteHandler.java","src/test/java/org/jsoup/integration/netty/TestPart.java","src/test/java/org/jsoup/integration/netty/TestRequest.java","src/test/java/org/jsoup/integration/netty/TestResponse.java","src/test/java/org/jsoup/integration/netty/TestResponseTest.java","src/test/java/org/jsoup/integration/routes/CookieRoute.java","src/test/java/org/jsoup/integration/routes/DeflateRoute.java","src/test/java/org/jsoup/integration/routes/EchoRoute.java","src/test/java/org/jsoup/integration/routes/FileRoute.java","src/test/java/org/jsoup/integration/routes/HelloRoute.java","src/test/java/org/jsoup/integration/routes/InterruptedRoute.java","src/test/java/org/jsoup/integration/routes/RedirectRoute.java","src/test/java/org/jsoup/integration/routes/SlowRider.java","src/test/java/org/jsoup/internal/ControllableInputStreamTest.java","src/test/java/org/jsoup/internal/NamespaceBindingsTest.java","src/test/java/org/jsoup/internal/QuietAppendableTest.java","src/test/java/org/jsoup/internal/ReaderTest.java","src/test/java/org/jsoup/internal/SoftPoolTest.java","src/test/java/org/jsoup/internal/StringUtilTest.java","src/test/java/org/jsoup/nodes/AttributeTest.java","src/test/java/org/jsoup/nodes/AttributesTest.java","src/test/java/org/jsoup/nodes/BuildEntities.java","src/test/java/org/jsoup/nodes/CommentTest.java","src/test/java/org/jsoup/nodes/DataNodeTest.java","src/test/java/org/jsoup/nodes/DocumentTest.java","src/test/java/org/jsoup/nodes/DocumentTypeTest.java","src/test/java/org/jsoup/nodes/ElementIT.java","src/test/java/org/jsoup/nodes/ElementTest.java","src/test/java/org/jsoup/nodes/EntitiesTest.java","src/test/java/org/jsoup/nodes/FormElementTest.java","src/test/java/org/jsoup/nodes/LeafNodeTest.java","src/test/java/org/jsoup/nodes/NodeIteratorTest.java","src/test/java/org/jsoup/nodes/NodeStreamTest.java","src/test/java/org/jsoup/nodes/NodeTest.java","src/test/java/org/jsoup/nodes/PrinterTest.java","src/test/java/org/jsoup/nodes/TextNodeTest.java","src/test/java/org/jsoup/parser/AttributeParseTest.java","src/test/java/org/jsoup/parser/CharacterReaderTest.java","src/test/java/org/jsoup/parser/HtmlParserTest.java","src/test/java/org/jsoup/parser/HtmlTreeBuilderStateTest.java","src/test/java/org/jsoup/parser/HtmlTreeBuilderTest.java","src/test/java/org/jsoup/parser/ParserIT.java","src/test/java/org/jsoup/parser/ParserSettingsTest.java","src/test/java/org/jsoup/parser/ParserTest.java","src/test/java/org/jsoup/parser/PositionTest.java","src/test/java/org/jsoup/parser/StreamParserTest.java","src/test/java/org/jsoup/parser/TagSetTest.java","src/test/java/org/jsoup/parser/TagTest.java","src/test/java/org/jsoup/parser/TokenQueueTest.java","src/test/java/org/jsoup/parser/TokeniserStateTest.java","src/test/java/org/jsoup/parser/TokeniserTest.java","src/test/java/org/jsoup/parser/XmlTreeBuilderTest.java","src/test/java/org/jsoup/safety/CleanerTest.java","src/test/java/org/jsoup/safety/SafelistTest.java","src/test/java/org/jsoup/select/CssTest.java","src/test/java/org/jsoup/select/ElementsTest.java","src/test/java/org/jsoup/select/EvaluatorDebug.java","src/test/java/org/jsoup/select/EvaluatorTest.java","src/test/java/org/jsoup/select/NodesTest.java","src/test/java/org/jsoup/select/QueryParserTest.java","src/test/java/org/jsoup/select/SelectorIT.java","src/test/java/org/jsoup/select/SelectorTest.java","src/test/java/org/jsoup/select/StructuralEvaluatorTest.java","src/test/java/org/jsoup/select/TraversorTest.java","src/test/java/org/jsoup/select/XpathTest.java","src/test/java11/org/jsoup/helper/HttpClientExecutorTest.java","src/test/java11/org/jsoup/helper/HttpClientTestAccess.java","src/test/java11/org/jsoup/integration/HttpClientConnectIT.java","src/test/java11/org/jsoup/integration/HttpClientConnectTest.java","src/test/java11/org/jsoup/integration/HttpClientSessionIT.java","src/test/java11/org/jsoup/integration/HttpClientSessionTest.java","src/test/resources/bomtests/bom_utf16be.html","src/test/resources/bomtests/bom_utf16le.html","src/test/resources/bomtests/bom_utf32be.html","src/test/resources/bomtests/bom_utf32le.html","src/test/resources/bomtests/bom_utf8.html","src/test/resources/bomtests/bom_utf8.html.gz","src/test/resources/fuzztests/1538.html.gz","src/test/resources/fuzztests/1539.html.gz","src/test/resources/fuzztests/1542.html.gz","src/test/resources/fuzztests/1543.html.gz","src/test/resources/fuzztests/1544.html.gz","src/test/resources/fuzztests/1569.html.gz","src/test/resources/fuzztests/1577.html.gz","src/test/resources/fuzztests/1580-attrname.html.gz","src/test/resources/fuzztests/1580.html.gz","src/test/resources/fuzztests/1593.html.gz","src/test/resources/fuzztests/1595.html.gz","src/test/resources/fuzztests/1596.html.gz","src/test/resources/fuzztests/1605.html.gz","src/test/resources/fuzztests/1606.html.gz","src/test/resources/fuzztests/1607.html.gz","src/test/resources/fuzztests/1611.html.gz","src/test/resources/fuzztests/1612.html.gz","src/test/resources/fuzztests/1613.html.gz","src/test/resources/fuzztests/1637.html.gz","src/test/resources/fuzztests/1638.html.gz","src/test/resources/fuzztests/1639.html.gz","src/test/resources/fuzztests/1640.html.gz","src/test/resources/fuzztests/1642.html.gz","src/test/resources/fuzztests/1644.html.gz","src/test/resources/fuzztests/1646.html.gz","src/test/resources/fuzztests/1695.html.gz","src/test/resources/fuzztests/1696.html.gz","src/test/resources/fuzztests/1697.html.gz","src/test/resources/fuzztests/2353.html.gz","src/test/resources/fuzztests/2374.html.gz","src/test/resources/fuzztests/2393.html.gz","src/test/resources/fuzztests/2397.html.gz","src/test/resources/fuzztests/36192.html.gz","src/test/resources/fuzztests/39164.html.gz","src/test/resources/fuzztests/399497256.html.gz","src/test/resources/fuzztests/422516687.html.gz","src/test/resources/fuzztests/48116.html.gz","src/test/resources/fuzztests/63202.html.gz","src/test/resources/fuzztests/63236.html.gz","src/test/resources/fuzztests/63242.html.gz","src/test/resources/fuzztests/63259.html.gz","src/test/resources/fuzztests/64720.html.gz","src/test/resources/fuzztests/65147.html.gz","src/test/resources/fuzztests/67469.html.gz","src/test/resources/fuzztests/9056.html.gz","src/test/resources/fuzztests/as-replace.html.gz","src/test/resources/fuzztests/ex-inselect16.html","src/test/resources/fuzztests/garble.html","src/test/resources/fuzztests/so-proc16-insert.html.gz","src/test/resources/fuzztests/so-proc16.html.gz","src/test/resources/htmltests/README","src/test/resources/htmltests/adopt-1.html","src/test/resources/htmltests/basehref.html","src/test/resources/htmltests/character-reader-buffer.html.gz","src/test/resources/htmltests/charset-base.html","src/test/resources/htmltests/comments.html","src/test/resources/htmltests/escapes-across-buffer.html","src/test/resources/htmltests/fake-gzip.html.gz","src/test/resources/htmltests/form-tests.html","src/test/resources/htmltests/gzip.html","src/test/resources/htmltests/gzip.html.gz","src/test/resources/htmltests/gzip.html.z","src/test/resources/htmltests/large.html","src/test/resources/htmltests/lowercase-charset-test.html","src/test/resources/htmltests/medium.html","src/test/resources/htmltests/meta-charset-1.html","src/test/resources/htmltests/meta-charset-2.html","src/test/resources/htmltests/meta-charset-3.html","src/test/resources/htmltests/namespaces.xhtml","src/test/resources/htmltests/osi-logo.svg","src/test/resources/htmltests/table-invalid-elements.html","src/test/resources/htmltests/table-polymer-template.html","src/test/resources/htmltests/test-rss.xml","src/test/resources/htmltests/thumb.jpg","src/test/resources/htmltests/upload-form.html","src/test/resources/htmltests/xml-charset.xml","src/test/resources/htmltests/xml-test.xml","src/test/resources/htmltests/xwiki-1324.html.gz","src/test/resources/htmltests/xwiki-edit.html.gz","src/test/resources/htmltests/yahoo-jp.html.gz","src/test/resources/local-cert/README.md","src/test/resources/local-cert/cert.conf","src/test/resources/local-cert/server.crt","src/test/resources/local-cert/server.key","src/test/resources/local-cert/server.p12","src/test/resources/local-cert/server.pfx","src/test/resources/printertests/input-1.html","src/test/resources/printertests/outline-1.html","src/test/resources/printertests/passthru-1.html","src/test/resources/printertests/pretty-1.html"],"storefront":"/r/jhy","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/jhy/jsoup/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}