正则入门问题:跨多行含非文本字符时提取HTML内容
问题:从HTML源码中提取书籍作者信息失败
背景
我需要从独立的书籍HTML页面中提取数据,生成书籍和作者列表,目前用正则方法提取书籍标题成功,但提取作者信息时遇到了问题。
成功提取书籍标题的实现
使用以下PowerShell代码可以成功获取书籍标题(示例返回结果为My First Cook Book):
>> $regexp = '<title>listing for - (?<title>.*) \[.*\]' >> $name = ($url | select-string $regexp -allmatches).matches >> $name.groups[1].value My First Cook Book
提取作者信息的失败尝试
我推测失败原因是目标HTML代码跨多行或包含特殊字符,尝试的代码及报错如下:
>> $regex1 = '<td class="tboldc" width="170"> Author:</td> >> <td class="tnormg" width="*"> (?<author>.*)</td>' >> $name1 = ($url | select-string $regex1 -allmatches).matches >> $name.groups[1].value Cannot index into a null array. At line:1 char:1 + $name1.groups[1].value
我需要提取的作者姓名为D Atherton,尝试过给&添加双引号、调整捕获组的位置,但只有当源码是单行时能得到不同结果,我认为需要匹配两行代码来定位Author:部分,并从第二行提取所需的作者信息。
最终解决方法
我最终坚持使用PowerShell正则解决了问题,具体步骤如下:
替换正则表达式
将原来的$regex1替换为:
$regex1 = '(?s) Author:<\/td>(?<author>.*?)<\/td'
提取并清洗作者姓名
使用以下代码处理匹配结果,得到最终的作者姓名:
$author = $name1.groups[1].value -creplace '^[^\;]*\;', ''
内容的提问来源于stack exchange,提问作者CJ Perry
相关产品推荐
相关产品推荐

