Java中使用Jsoup抓取ilan.gov.tr网页数据遇选择器问题求助
解决Jsoup抓取动态渲染页面数据的问题
问题核心分析
你当前代码存在两个关键问题:
- 页面是Angular动态渲染的:Jsoup直接调用
connect().get()只能获取初始静态HTML,无法拿到浏览器渲染后加载的动态表格数据。 - CSS选择器语法错误:你写的选择器不符合规范,比如
search-results-content row ng-tns-c146-3是把多个类名/标签名直接拼接,正确多类选择器需用.分隔;另外ng-tns-c146-3、ng-star-inserted这类是Angular动态生成的属性,会随页面更新变化,不能作为稳定定位依据。
可行解决方案
方案1:模拟浏览器渲染(推荐)
借助Selenium工具模拟浏览器加载页面,获取渲染后的完整源码再用Jsoup解析,示例代码如下:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class IlanGovScraper { public static void main(String[] args) { // 配置ChromeDriver路径,替换为你本地的实际路径 System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); // 启用无头模式,不弹出浏览器窗口 ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new"); WebDriver driver = new ChromeDriver(options); try { driver.get("https://www.ilan.gov.tr/ilan/kategori/9/ihale-duyurulari"); // 等待页面加载完成,可根据网络情况调整等待时长 Thread.sleep(3000); // 获取渲染后的页面源码 String pageSource = driver.getPageSource(); Document doc = Jsoup.parse(pageSource); // 使用稳定的语义化类名定位数据行 for (Element row : doc.select(".search-results-content .list-item")) { // 提取标题 String title = row.select(".list-desc").text(); // 提取右侧信息列 String info = row.select(".col.col-4.col-lg-4").text(); System.out.println("标题:" + title); System.out.println("附加信息:" + info); System.out.println("---"); } } catch (Exception e) { e.printStackTrace(); } finally { driver.quit(); } } }
方案2:直接调用数据API
打开浏览器开发者工具(F12)切换到Network标签,刷新页面后查找加载招标数据的XHR请求,直接调用该API获取JSON格式数据,这种方式比模拟渲染更高效。
选择器使用注意事项
- 避免使用Angular动态生成的类名(如
ng-tns-*、ng-star-inserted),这类类名不稳定,会随页面版本变动。 - 优先使用静态、语义化的类名或标签结构定位元素,比如
.list-desc、.list-item这类具有明确含义的类。 - 多类选择器必须用
.分隔,比如.col.col-4.col-lg-4,而非.col col-4 col-lg-4。
内容的提问来源于stack exchange,提问作者Furkan Uğurlu
相关产品推荐
相关产品推荐

