如何用Scala Scraper单查询选择含指定属性的标签(如带href的<a>)?
如何用Scala Scraper安全地单步选择带指定属性的标签
嘿,我懂你想解决的问题——原来的两步查询确实不够稳妥,要是页面里找不到<a>标签,或者找到的<a>不带href属性,代码很容易直接抛出异常。咱们可以用CSS选择器直接一步筛选出带目标属性的标签,再结合Scala Scraper的安全提取方法,就能避免这些问题啦!
核心思路
CSS选择器里,a[href]这个语法专门用来匹配带有href属性的<a>标签(不管href的值是什么)。结合Scala Scraper的DSL,我们可以用这个选择器直接定位目标元素,再用安全的提取方法处理属性,不用拆分两步操作。
安全的单步查询示例
下面是完整的代码示例,包含单个元素和多个元素的处理方式:
import net.ruippeixotog.scalascraper.browser.JsoupBrowser import net.ruippeixotog.scalascraper.dsl.DSL._ import net.ruippeixotog.scalascraper.dsl.DSL.Extract._ val browser = JsoupBrowser() val doc = browser.get("https://...") // 1. 安全获取第一个带href的<a>标签(返回Option[Element],找不到就返回None) val firstLinkWithHref = doc >> elementOpt("a[href]") // 2. 从这个标签里安全提取href属性(返回Option[String]) val firstHref = firstLinkWithHref >>= (_.attrOpt("href")) // 或者一步到位,直接获取第一个符合条件的href val directFirstHref = doc >> elementOpt("a[href]") >>= (_.attrOpt("href")) // 3. 如果要获取所有带href的<a>标签 val allLinksWithHref = doc >> elements("a[href]") // 提取所有href(如果确定所有标签都有href,用attr;否则用attrOpt返回List[Option[String]]) val allHrefs = allLinksWithHref.map(_ >> attr("href"))
为什么比原来的代码更安全?
- 原来的
element("a")如果页面里没有<a>标签,会直接抛出异常;而elementOpt会返回None,我们可以优雅处理这种空值场景。 - 原来的
attr("href")如果找到的<a>没有href属性,也会抛出异常;attrOpt会返回None,避免程序崩溃。
处理结果的示例
你可以用模式匹配或者getOrElse来处理返回的Option值:
directFirstHref match { case Some(href) => println(s"成功找到链接:$href") case None => println("页面中没有带href属性的<a>标签") } // 或者用getOrElse给默认值 val hrefOrDefault = directFirstHref.getOrElse("默认链接")
内容的提问来源于stack exchange,提问作者ntviet18
相关产品推荐
相关产品推荐

