Bash - HTML内容的正则表达式

Mr.*_*. C 1 regex bash

我正在学习Bash脚本,需要一些帮助来理解正则表达式.

我有一个变量,基本上是网页的html(使用wget导出):

currentURL = "https://www.example.com"
currentPage=$(wget -q -O - $currentURL)
Run Code Online (Sandbox Code Playgroud)

我想获取此页面中所有链接照片的ID.我只需要帮助搞清楚RegEx应该是什么.

我从这开始,但我需要修改正则表达式:

测试字符串(这是currentURL包含的内容,可以有零到多个实例):

<a href="./download/file.php?id=123456&mode=view"><img src="./download/file.php?id=123456&t=1"></a>
Run Code Online (Sandbox Code Playgroud)

目前的正则表达式:

.\/download\/file.php\?id=[0-9]{6}\&mode=view
Run Code Online (Sandbox Code Playgroud)

这是我创建的正则表达式,但它似乎不适用于bash.

最好的解决方案是拥有每个文件的ID.在这种情况下,简单地说123456.但如果我们可以从获得开始/download/file.php?id=123456,那将是一个良好的开端.

Gil*_*not 5

不要使用正则表达式解析HTML,使用适当的XML/HTML解析器.

理论:

根据编译理论,HTML无法使用基于有限状态机的正则表达式进行解析.由于HTML的分层结构,您需要使用下推自动机并使用YACC等工具操纵LALR语法.

realLife©®™ 日常工具:

您可以使用以下之一:

xmllint通常默认安装libxml2,xpath1

xmlstarlet可以编辑,选择,转换...默认情况下不安装xpath1

通过perl的模块XML :: XPath,xpath1安装xpath

xidel xpath3

saxon-lint我自己的项目,包装在@Michael Kay的Saxon-HE Java库中,xpath3

或者您可以使用高级语言和适当的库,我想到:

lxml(from lxml import etree)

XML::LibXML,XML::XPath,XML::Twig::XPath,HTML::TreeBuilder::XPath


检查:使用带有HTML标记的正则表达式


使用,示例:

currentURL="https://www.example.com"
printf '%s\n' $(xmllint --html --xpath '//a/@href' "$currentUrl" 2>/dev/null) |
    grep -oP 'id=\K\d+'
Run Code Online (Sandbox Code Playgroud)

或者用:

printf '%s\n' $(xmllint --html --xpath '//a/@href' "$currentUrl" 2>/dev/null) |
    sed -E 's/id=([0-9]+)/\1/'
Run Code Online (Sandbox Code Playgroud)

或者单独使用:

xidel -s "$currentURL" -e '//a/extract(@href,"id=(\d+)",1)'
Run Code Online (Sandbox Code Playgroud)

谢谢@Reino


您更新的正则表达式

注意 :

  • printf仅仅有爆炸的xmllint用换行输出.我们可以使用:xmllint ..... | tr '[[:space:]]' $'\n' | grep -oP 'id=\K\d+'
  • 变量赋值不允许空格,所以currentURL = "https://www.example.com"=>currentURL="https://www.example.com"