0

bash 脚本的新手,以前的答案对我没有帮助。

我正在尝试从网页中获取 id,我需要解析page1,获取 id 列表,并使用它们来解析相应的网页。

问题是我不确定如何编写脚本......

这是我想做的事情:

  1. url1根据解析regexp。输出:提取的 id 列表(101102103等)。
  2. 用输出id解析每个url,例如:parse( http://someurl/101),然后parse( http://someurl/102)等。

到目前为止,我想出了这个命令:

curl http://subtitle.co.il/browsesubtitles.php?cs=movies | grep -o -P '(?<=list.php\?mid=)\d+'  

上面的命令有效,并给出了一个 id 列表。

对接下来的步骤有什么建议吗?我在正确的轨道上吗?

谢谢!

4

3 回答 3

0

这是一个递归算法,所以你需要写一个函数:

parse_url() {
  ids=$(curl "$1" | grep -o -P '(?<=list.php\?mid=)\d+')
  for id in $ids
  do echo $id
     parse_url "http://someurl/$id"
  done
}

使用起始页面调用此函数,它将回显在该页面上找到的所有 ID,然后递归解析所有http://someurl/ID页面。

这只是回显在所有页面中找到的所有 ID。如果您想对找到的 ID 执行其他操作,可以将此脚本通过管道传递给该 ID。另外,我不做任何重复抑制,所以如果页面之间有反向引用,这个脚本可能会永远循环。您可以跟踪已经在数组中看到的 ID,并在递归之前检查它。

于 2012-10-03T23:26:19.010 回答
0

您下一步可能会对所有 id 进行循环:

parse_url () {
    for id in $(grep -o -P '(?<=list.php\?mid=)\d+' "$1"); do
        # Use $id
        url="http://someurl/$id"
        # or parse for the URL with the ID
        url="$(grep -o -P 'http://[a-zA-Z./%0-9:&;=?]*list.php\?mid=$id[a-zA-Z./%0-9:&;=?]*' "$1")"
        # Get page
        new_page_file="$(mktemp)"
        wget -q -O "$new_page_file" "$url"
        # Parse url
        parse_url "$new_page_file"
        # Delete old temporary file
        rm "$new_page_file"
    done
}

wget -q -O file.html http://subtitle.co.il/browsesubtitles.php?cs=movies
parse_url file.html

在这里,我们定义了一个名为 的函数parse_url,它遍历它在作为参数传递的文件中找到的所有 id(即,$1是传递给函数的第一个参数)。

然后我们可以使用 ID 生成 URL,或者我们可以从同一文件中 grep URL,现在提取 ID。请注意,用于查找 URL 的正则表达式假定 URL 具有特定格式:

  1. 它以“http://”开头
  2. 它仅包含方括号之间使用的字符

要下载页面,我们使用命令创建一个临时文件mktemp。既然您说您是 bash 脚本的新手,我将简要解释$(...)一下出现的 s。他们运行括号之间指定的命令或一系列命令,然后执行它们,捕获它们的标准输出并将其放置在原来的位置$(...)$new_page_file在这种情况下,它被放置在我们分配给变量的双引号内。因此$new_page_file包含为存储临时文件而创建的随机文件名。

然后,我们可以将 URL 下载到该临时文件中,调用该函数对其进行解析,然后将其删除。

为了最初调用该函数,我们将初始 URL 下载到一个文件file.html中,然后调用该函数并将该文件名作为参数传递。

编辑:添加递归,基于Barmar的回答

希望这会有所帮助=)

于 2012-10-03T23:35:55.057 回答
0

这种 cli html 解析正是我编写Xidel的目的。(而且它使用 xpath 而不是正则表达式,所以你不会召唤Cthulhu ......(太晚了,他已经在那里了,我刚去我的浴室,有这个非常奇怪的声音......))

如果您只需要ID

使用它们来解析相应的网页。

您可以只关注链接,而不是显式提取 id。

例如打印所有链接页面的标题

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -f '//a[starts-with(@href,"list.php")]' -e //title

//a 通过跟踪其目的地的所有链接starts-with(@href,"list.php")。(-f表示跟随链接,-e:表示提取数据。)

或者,如果您想提取视图 url 上的大文本块:(不懂语言,不知道它在说什么......)

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -f '//a[starts-with(@href,"list.php")]/replace(@href, "list.php[?]mid=", "view.php?id=")' -e 'css("#profilememo")'

或者如果你真的需要单独的 id,你可以先提取它们:

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -e '//a[starts-with(@href,"list.php")]/substring-after(@href,"mid=")' -f '//a[starts-with(@href,"list.php")]' -e //title

或者更容易使用临时变量links来存储所有链接:

xidel 'http://subtitle.co.il/browsesubtitles.php?cs=movies' -e '(links:=//a[starts-with(@href,"list.php")])[0]' -e '$links/substring-after(@href,"mid=")' -f '$links' -e //title
于 2012-10-03T23:37:39.290 回答