我正在用Powershell进行一些web抓取。网站上有一个项目的代码是这样的:
<h1 class="">1001 Nights <span id="titleYear">(<a href="/year/1968/?ref_=tt_ov_inf">1968</a>)</span> </h1>
我想提取里面的文本,这个文本:
1001 Nights
但不是这个文本:
<span id="titleYear">(<a href="/year/1968/?ref_=tt_ov_inf">1968</a>)</span>
网站上的CSS选择器类似于:
"#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"
在Stack Overflow上进行了一些搜索,我找到了下面的作业代码。
$Result = Invoke-WebRequest -Uri "https://www.imdb.com/title/tt0062940/?ref_=ttls_li_tt"
$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"
$NodeList = $Result.ParsedHtml.querySelectorAll( $movieTitleSelector)
$PsNodeList = @()
for ($i = 0; $i -lt $NodeList.Length; $i++) {
$PsNodeList += $NodeList.item($i)
}
$PsNodeList | ForEach-Object {
$_.InnerText
}
结果是:
1001 Nights (1968)
《一千零一夜》是电影名称,《1968》是<span></span>
中包含的上映年份。我只想要标题部分,而不是发布年份部分。我在Stack Overflow上发现了一些代码,说我可以通过将上面文本中的代码更改为:来独占地选择<h1>
标签中不在<span>
内的文本
$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1 :not(span)"
但当我运行代码时,它会抛出
Invalid argument.
At line:1 char:1
+ $NodeList = $Result.ParsedHtml.querySelectorAll( "#title-overview-wi ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException
错误。我认为出现错误是因为$movieTitleSelector字符串中有一个冒号,但我不太确定。任何人请告诉我如何在<h1>
元素中获得标题文本,而不是在<span>
标记中。非常感谢。
为什么不呢?只需在摘录中使用regex删除年份或您想要的任何字符串。
$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1 :not(span)" -replace 's(d{4})'
'1001 Nights (1968)' -replace 's(d{4})'
<#
# Results
1001 Nights
#>
更新
试试这个。。。根据您的反应。
$Result = Invoke-WebRequest -Uri "https://www.imdb.com/title/tt0062940/?ref_=ttls_li_tt"
$movieTitleSelector = "#title-overview-widget > div.vital > div.title_block > div > div.titleBar > div.title_wrapper > h1"
$NodeList = $Result.ParsedHtml.querySelectorAll( $movieTitleSelector)
$PsNodeList = @()
for ($i = 0; $i -lt $NodeList.Length; $i++) {
$PsNodeList += $NodeList.item($i)
}
$PsNodeList |
ForEach-Object {
$_.InnerText -replace 's(d{4})'
}