
请教一个问题,对于一个网页中的某个 DOM node,如何获取渲染之后的位置呢?比如按照 1920x1080 的分辨率来渲染,某个网页的渲染后实际像素数量是 1920x3000,标题对应的矩形框的左上和右下角分别是 (200, 200) 和 (1500, 400),正文对应的框的左上角和右下角分别是 (200, 500) 和 (1500, 2500) 这样。
如果能够用 headless 的方法渲染网页然后获取上述信息的话,或许可以训练个模型什么的,比如预测标题和正文对应的 DOM node,或者预测哪些 DOM node 贡献了可见的内容。如果想训练这种模型的话,可能还需要更进一步来标注数据,把网页渲染成图片之后把特定的 DOM node 高亮出来(比如画个框),然后根据对应的任务进行人工标注。
汇报一下:用 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 更新了,之前重复的两步校验消失 ... 1 runze 2021-10-18 13:06:36 +08:00 getBoundingClientRect |
2 Pastsong 2021-10-18 13:15:34 +08:00 你们怎么干什么都想训练个模型,浪费电吗 |
3 mekingname 2021-10-18 13:49:23 +08:00 |
4 clockwise9 OP @runze 感谢!这个函数返回的 viewport 就是我想要的,网上搜了一下似乎可以在 CapserJS 里面搞,我去继续学习一下 |
5 clockwise9 OP @Pastsong 求不打脸,训练模型我都搞不利索,别的就更不会了。。。 |
6 clockwise9 OP @mekingname 感谢分享,我之前就想,基于 HTML 内容和结构的抽取方法应该有比较成熟的开源方案了,果然如此。所以我更想尝试一些不一样的东西,如果用模型把位置信息和内容结合在一起,可能会有更多的火花。 |
7 mekingname 2021-10-18 17:32:41 +08:00 @clockwise9 是的,所以最新版本里面我就是这样做的。 |
8 loading 2021-10-18 17:37:30 +08:00 看来以后看到“训练模型”字眼的东西,基本和“大数据”一样,也是忽悠人的,实际那人可以说是业余得很。 |
9 clockwise9 OP @mekingname 我只在 ContentExtractor.py 里面看到 “正文块的高度应该要大于 150px” 的逻辑,还有别的地方用了位置信息吗?有的话求明示,谢谢! |
10 mekingname 2021-10-19 15:35:31 +08:00 @clockwise9 已经更新的代码只有这里。还有一些其它位置信息,代码还在我电脑上没有更新。 |