在不知道所有属性的情况下从 HTML 标记内部获取文本

Posted

技术标签:

【中文标题】在不知道所有属性的情况下从 HTML 标记内部获取文本【英文标题】:Getting text from inside HTML tag without knowing all attributes 【发布时间】:2016-03-25 05:15:20 【问题描述】:

我正在尝试通过以下链接抓取在 docker hub 中找到的所有存储库名称:https://hub.docker.com/search/?q=*&page=1&isAutomated=0&isOfficial=1&pullCount=0&starCount=0

我感兴趣的 html 标签是:

<div class="RepositoryListItem__repoName___3iIWs" data-reactid=".s0zyncta0w.1.2.1.0.0.$4lexnz/overtime.0.0.1.0">4lexnz/overtime</div>

每个存储库的 data-reactid 总是不同的。

我正在使用 Bash,并希望在每个包含 class="RepositoryListItem__repoName___3iIWs" 的 div 的 div 标签之间查找文本。有人可以帮我构建一个正则表达式和命令链来在 bash 中执行此操作吗?

到目前为止我有:

content=$(curl -L 'https://hub.docker.com/search/?q=*&page=1&isAutomated=0&isOfficial=0&pullCount=0&starCount=0')
echo $content | grep -oP '(?<=<div class="RepositoryListItem__repoName___3iIWs").*?(?= </div>)'

但这根本不返回任何东西。 $content 的值是正确的,所以它是最后一个没有做我想做的事情的 grep。有人可以帮忙吗?谢谢!

【问题讨论】:

【参考方案1】:

我认为你应该使用类似的东西:

content=$(curl -L 'https://hub.docker.com/search/?q=*&page=1&isAutomated=0&isOfficial=0&pullCount=0&starCount=0')
echo $content | grep -oP '<div class="RepositoryListItem__repoName___3iIWs"\s(.)+?>(\K.+?)(?=<\/div>)'

这似乎对我有用,通过这种方式,您可以提取一个包含 &lt;div &gt;&lt;/div&gt; 内文本的组。

请注意,我在将 RegEx 与 grep 结合使用方面还很陌生,所以可能会有一些聪明的地方,但这可以满足您的需求。 \K 标志删除它之前的所有匹配项,并使用 (?=) 从匹配项中删除 &lt;/div&gt; 部分。

【讨论】:

太棒了!如果您想让它变得更好,我添加了一些额外的信息! ;)

以上是关于在不知道所有属性的情况下从 HTML 标记内部获取文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在不破坏内部绑定的情况下从外部初始化自定义项的属性?

如何在不通过视图在所有页面中发送表单的情况下从 django 布局(如“base.html”)获取表单数据?

在不知道对象索引的情况下从数组中删除对象?

如何在不导入的情况下从 .dmp 文件中列出 Oracle 中的所有模式和表空间?

如何在不提交 HTML 表单的情况下从数据库中获取数据? [复制]

如何在不知道匹配返回的 json 数据中的所有值的情况下从 .Net 核心中的 Web api 调用创建模型?