请教一个问题,对于一个网页中的某个 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 已经更新的代码只有这里。还有一些其它位置信息,代码还在我电脑上没有更新。
|