V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
clockwise9
V2EX  ›  问与答

如何获得网页渲染后每个 DOM node 的位置

  •  
  •   clockwise9 · 2021-10-18 12:52:55 +08:00 · 1199 次点击
    这是一个创建于 1164 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教一个问题,对于一个网页中的某个 DOM node,如何获取渲染之后的位置呢?比如按照 1920x1080 的分辨率来渲染,某个网页的渲染后实际像素数量是 1920x3000,标题对应的矩形框的左上和右下角分别是 (200, 200) 和 (1500, 400),正文对应的框的左上角和右下角分别是 (200, 500) 和 (1500, 2500) 这样。

    如果能够用 headless 的方法渲染网页然后获取上述信息的话,或许可以训练个模型什么的,比如预测标题和正文对应的 DOM node,或者预测哪些 DOM node 贡献了可见的内容。如果想训练这种模型的话,可能还需要更进一步来标注数据,把网页渲染成图片之后把特定的 DOM node 高亮出来(比如画个框),然后根据对应的任务进行人工标注。

    第 1 条附言  ·  2021-10-21 12:39:39 +08:00

    汇报一下:用 Selenium 可以解决,本地配了 Chromedriver 之后,如下代码解君愁:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument("window-size=1920,1080")
    
    d = webdriver.Chrome(chrome_options=chrome_options)
    d.get('http://www.v2ex.com')
    elems = d.find_elements_by_class_name('topic-link')
    
    print(len(elems), 'elements found')
    
    for i, elem in enumerate(elems):
        print(i + 1, '/', len(elems), 'location:', elem.location, 'size:', elem.size, 'content:', elem.text)
    
    

    输出如下:

    49 elements found
    1 / 49 location: {'x': 490, 'y': 162} size: {'height': 17, 'width': 205} content: WSL 2 拳打 macOS,脚踢 Ubuntu ?
    2 / 49 location: {'x': 490, 'y': 233} size: {'height': 17, 'width': 90} content: 想问下有 Pixel 用户吗?
    3 / 49 location: {'x': 490, 'y': 304} size: {'height': 17, 'width': 246} content: Windows Subsystem for Android 来了
    4 / 49 location: {'x': 490, 'y': 375} size: {'height': 17, 'width': 247} content: Google Authenticator 更新了,之前重复的两步校验消失
    ...
    
    10 条回复    2021-10-19 15:35:31 +08:00
    runze
        1
    runze  
       2021-10-18 13:06:36 +08:00
    getBoundingClientRect
    Pastsong
        2
    Pastsong  
       2021-10-18 13:15:34 +08:00
    你们怎么干什么都想训练个模型,浪费电吗
    mekingname
        3
    mekingname  
       2021-10-18 13:49:23 +08:00
    实际上我已经写好了,你可以看我的代码:

    https://v2ex.com/t/806234#reply10
    clockwise9
        4
    clockwise9  
    OP
       2021-10-18 13:56:17 +08:00
    @runze 感谢!这个函数返回的 viewport 就是我想要的,网上搜了一下似乎可以在 CapserJS 里面搞,我去继续学习一下
    clockwise9
        5
    clockwise9  
    OP
       2021-10-18 13:57:40 +08:00
    @Pastsong 求不打脸,训练模型我都搞不利索,别的就更不会了。。。
    clockwise9
        6
    clockwise9  
    OP
       2021-10-18 14:03:05 +08:00
    @mekingname 感谢分享,我之前就想,基于 HTML 内容和结构的抽取方法应该有比较成熟的开源方案了,果然如此。所以我更想尝试一些不一样的东西,如果用模型把位置信息和内容结合在一起,可能会有更多的火花。
    mekingname
        7
    mekingname  
       2021-10-18 17:32:41 +08:00
    @clockwise9 是的,所以最新版本里面我就是这样做的。
    loading
        8
    loading  
       2021-10-18 17:37:30 +08:00
    看来以后看到“训练模型”字眼的东西,基本和“大数据”一样,也是忽悠人的,实际那人可以说是业余得很。
    clockwise9
        9
    clockwise9  
    OP
       2021-10-19 14:48:25 +08:00
    @mekingname 我只在 ContentExtractor.py 里面看到 “正文块的高度应该要大于 150px” 的逻辑,还有别的地方用了位置信息吗?有的话求明示,谢谢!
    mekingname
        10
    mekingname  
       2021-10-19 15:35:31 +08:00
    @clockwise9 已经更新的代码只有这里。还有一些其它位置信息,代码还在我电脑上没有更新。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.