Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Bash命令问题

Bash命令问题
EN

Stack Overflow用户
提问于 2022-04-11 10:40:12
回答 2查看 81关注 0票数 0

我试图进一步解析我使用一个额外的grep命令生成的输出文件。我目前使用的代码是:

代码语言:javascript
运行
AI代码解释
复制
##!/bin/bash

# fetches the links of the movie's imdb pages for a given actor

# fullname="USER INPUT"
read -p "Enter fullname: " fullname

if [ "$fullname" = "Charlie Chaplin" ];
code="nm0000122"
then
code="nm0000050"
fi


curl "https://www.imdb.com/name/$code/#actor" | grep -Eo 
'href="/title/[^"]*' | sed 's#^.*href=\"/#https://www.imdb.com/#g' | 
sort -u > imdb_links.txt

#parses each of the link in the link text file and gets the details for 
each of the movie. THis is followed by the cleaning process
for i in $(cat imdb_links.txt) 
do 
   curl $i | 
   html2text | 
   sed -n '/Sign_In/,$p'|  
   sed -n '/YOUR RATING/q;p' | 
   head -n-1 | 
   tail -n+2 
done > imdb_all.txt

生成的示例输出如下:

代码语言:javascript
运行
AI代码解释
复制
EN* Fully supported
    * English (United States)
    * Partially_supported
    * Français (Canada)
    * Français (France)
    * Deutsch (Deutschland)
    * हिंदी (भारत)
    * Italiano (Italia)
    * Português (Brasil)
    * Español (España)
    * Español (México)
****** Duck Soup ******
    * 19331933
    * Not_RatedNot Rated
    * 1h 9m
IMDb RATING
7.8/10

如何更改代码以进一步解析输出,以便只从电影标题中获取数据直到imdb分级(在本例中,包含标题“Duck Soup”的行一直到结尾)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-11 11:40:56

以下是代码:

代码语言:javascript
运行
AI代码解释
复制
#!/bin/bash

# fullname="USER INPUT"
read -p "Enter fullname: " fullname

if [ "$fullname" = "Charlie Chaplin" ]; then
  code="nm0000122"
else
  code="nm0000050"
fi

rm -f imdb_links.txt

curl "https://www.imdb.com/name/$code/#actor" |
  grep -Eo 'href="/title/[^"]*' |
  sed 's#^href="#https://www.imdb.com#g' |
  sort -u |
while read link; do
   # uncomment the next line to save links into file:
   #echo "$link" >>imdb_links.txt

   curl "$link" |
     html2text -utf8 |
     sed -n '/Sign_In/,/YOUR RATING/ p' |
     sed -n '$d; /^\*\{6\}.*\*\{6\}$/,$ p'
done >imdb_all.txt
票数 1
EN

Stack Overflow用户

发布于 2022-04-23 15:58:58

请(!)看看下面的urls,为什么用sed解析HTML是个坏主意

您要做的事情可以使用HTML/XML/JSON解析器西德尔完成,只需一个调用即可完成!

在本例中,我将使用查理卓别林的IMDB作为源代码。

提取所有94个“演员”IMDB电影urls:

代码语言:javascript
运行
AI代码解释
复制
$ xidel -s "https://www.imdb.com/name/nm0000122" -e '
  //div[@id="filmo-head-actor"]/following-sibling::div[1]//a/@href
'
/title/tt0061523/?ref_=nm_flmg_act_1
/title/tt0050598/?ref_=nm_flmg_act_2
/title/tt0044837/?ref_=nm_flmg_act_3
[...]
/title/tt0004288/?ref_=nm_flmg_act_94

没有必要将这些保存到文本文件中。只需使用-f (--follow)而不是-exidel就会打开它们。

对于单个电影urls,您可以解析HTML以获得所需的文本节点.

代码语言:javascript
运行
AI代码解释
复制
$ xidel -s "https://www.imdb.com/title/tt0061523/?ref_=nm_flmg_act_1" -e '
  //h1,
  //div[@class="sc-94726ce4-3 eSKKHi"]/ul/li[1]/span,
  //div[@class="sc-94726ce4-3 eSKKHi"]/ul/li[3],
  (//div[@class="sc-7ab21ed2-2 kYEdvH"])[1]
'
A Countess from Hong Kong
1967
2h
6.0/10

...but和class-names,我想说,这是一个相当脆弱的努力。相反,我建议解析<script>-node中HTML源代码顶部的JSON:

代码语言:javascript
运行
AI代码解释
复制
$ xidel -s "https://www.imdb.com/title/tt0061523/?ref_=nm_flmg_act_1" -e '
  parse-json(//script[@type="application/ld+json"])/(
    name,
    datePublished,
    duration,
    aggregateRating/ratingValue
  )
'
A Countess from Hong Kong
1967-03-15
PT2H
6

...or以获得类似的输出,如下所示:

代码语言:javascript
运行
AI代码解释
复制
$ xidel -s "https://www.imdb.com/title/tt0061523/?ref_=nm_flmg_act_1" -e '
  parse-json(//script[@type="application/ld+json"])/(
    name,
    year-from-date(date(datePublished)),
    substring(lower-case(duration),3),
    format-number(aggregateRating/ratingValue,"#.0")||"/10"
  )
'
A Countess from Hong Kong
1967
2h
6.0/10

全部合并:

代码语言:javascript
运行
AI代码解释
复制
$ xidel -s "https://www.imdb.com/name/nm0000122" \
  -f '//div[@id="filmo-head-actor"]/following-sibling::div[1]//a/@href' \
  -e '
    parse-json(//script[@type="application/ld+json"])/(
      name,
      year-from-date(date(datePublished)),
      substring(lower-case(duration),3),
      format-number(aggregateRating/ratingValue,"#.0")||"/10"
    )
  '
A Countess from Hong Kong
1967
2h
6.0/10
A King in New York
1957
1h50m
7.0/10
Limelight
1952
2h17m
8.0/10
[...]
Making a Living
1914
11m
5.5/10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71832737

复制
相关文章
在 Ubuntu 中安装 DHCP 服务器
1、 运行下面的命令来安装 DHCP 服务器包,也就是 dhcp3-server。
用户4988085
2021/09/15
7.6K0
在服务器(Windows)中开启声音
1.使用远程桌面连接服务器,进入服务器以后右键单击开始,选择运行 image.png 2. 点击运行之后,在输入框内输入:gpedit.msc image.png 3、打开之后,依次点击:计算机配置--管理模板--windows组件--远程桌面服务--远程桌面会话主机--设备和资源重定向--左键双击允许音频录制重定向--选择已启用后点应用。 image.png image.png image.png image.png image.png 4.点击服务器管理器,找到工具,打开服务 image.png ima
逸轩
2021/10/29
16.3K0
在 Node 中调用 Python
在 Node 中如何调用 Python 的方法?通常可以通过 REST 接口或者 RPC 的方式来完成,但是某些时候我们仅仅只需要调用对方几个很简单的方法,这种情况下去构建一个提供 REST 接口的服务或者两者对接实现 RPC 调用,这种做法的成本显然有点高。本文将会介绍一种更轻量的调用方式。
凌虚
2020/07/17
5.8K0
在服务器上运行Python项目
Anaconda是一个开源Python发行版本,包括Python 和很多常用库如Numpy、Matplotlib等,对小白很方便
Minerva
2020/05/25
4.2K0
在Java中调用Python
在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。
编程随笔
2019/09/11
5.2K0
在Java中调用Python
在 Ubuntu 中 安装python
virtualenvwrapper: 基于 virtualenv 之上的一个工具,通过它可以方便的创建/激活/管理/销毁虚拟环境,没它的话进行上面的操作将会相当麻烦。
py3study
2020/01/09
2.4K0
在 Python 中解析 JSON 数据
json模块是Python 标准库的一部分,它允许你对 JSON 数据进行编码和解码。
雪梦科技
2020/06/28
17.3K0
在windows中:双击运行Python
一、安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退。怎样避免闪退呢?
py3study
2020/01/06
4.6K0
在windows中:双击运行Python
在 Python 中播放声音
我们首先检查playsound库,它为在Python中播放声音文件提供了一个简单直接的解决方案。凭借其最低的设置要求,开发人员可以使用单个函数调用将音频播放快速集成到他们的应用程序中。但是,对于更高级的音频功能,我们深入研究了两个流行的库:pygame和pyglet。Pygame是一个强大的多媒体库,以其处理音频,图形和用户输入的能力而闻名。
很酷的站长
2023/08/11
8940
在 Python 中播放声音
在C++中调用Python
虽然现在Python编程语言十分的火爆,但是实际上非要用一门语言去完成所有的任务,并不是说不可以,而是不合适。在一些特定的、对于性能要求比较高的场景,还是需要用到传统的C++来进行编程的。但是C++的一个缺点是比较难找到很好的轮子,这也是很多人专用Python的一个重要原因。这篇文章我们要介绍的是一个比较特殊的场景——用C++的代码去调用Python函数中实现的一些功能。这样的话,如果代码的主体还是用C++完成的,而部分功能为了简便,引入一些Python中已经封装好的函数,这样就可以很好的结合两种语言各自的特点。而另一种工作方式:通过Python来调用一些C++或者Fortran中实现的高性能函数,可以参考这一篇博客。这两种不同的使用方法各有优劣,但是如果以Python为主导,就很难避开GIL的问题,这里我们就不过多的展开。
DechinPhy
2021/05/27
4.3K0
python在sqlite中插入数据
python通过引入sqlite的包,就能够直接操作sqlite数据库 import sqlite3 import math cx=sqlite3.connect("mydatabase.sqli
py3study
2020/01/06
4K0
在LaTeX中插入python代码
老师突然要求交上去的论文需要在附录加上代码,奈何我使用的LaTeX模板只能高亮显示Matlab的代码,但是我写论文的时候绝大部分代码都是用Python写的在这里实名吐槽一下Matlab的数据处理功能这么拉跨,不知道为什么还被拿来当数据挖掘课的第一语言,没办法,只能找一个方法让LaTeX里面能高亮显示Python代码。
Hsinyan
2022/06/19
6.8K0
在LaTeX中插入python代码
getopt在Python中的使用
在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能。目前有短选项和长选项两种格式。短选项格式为”-“加上单个字母选项;长选项为”–“加上一个单词。长格式是在Linux下引入的。许多Linux程序都支持这两种格式。在Python中提供了getopt模块很好的实现了对这两种用法的支持,而且使用简单。
全栈程序员站长
2022/08/13
7K0
在Linux/CentOS中编译安装Python
心血来潮,想学习一下Python,听说用来做爬虫还不错。先从运行环境开始入手,CentOS中已经内置了Python,但版本似乎比较老,通过python -V命令看到版本是2.4.3。目前Python 2.x的最新版本号是2.7.8,那么就开始动手升级一下。
魏杰
2022/12/23
7280
Python在HiveQL中的运用
在写HiveQL的时候,往往发现内置函数不够用,Hive支持用户自定义函数UDF,使用Java进行开发。很多时候这显得过于繁重。因而Hive中提供了Transform机制(基于hadoop streaming),这种机制相当于提供了一个脚本程序的入口,因此我们可以很方便的使用shell、perl、python等语言进行开发。
py3study
2020/01/13
1.6K0
在latex中写python代码
大家都知道,python现在用的是越来越多了,功能强大,易于上手,如果能借助于其强大的绘图功能,latex岂不碉堡了?
py3study
2020/01/07
2K0
在latex中写python代码
在 Xcode 9 中搭建 Python
macOS、Xcode 9、Python(macOS 默认安装了 Python2.7)。
py3study
2020/01/09
1.8K0
在Python中如何使用Elasticsearch?
在这篇文章中,我将讨论Elasticsearch以及如何将其整合到不同的Python应用程序中。
马哥linux运维
2019/06/10
8.2K0
在Python中如何使用Elasticsearch?
在Python中定义Main函数
多编程语言都有一个特殊的函数,当操作系统开始运行程序时会自动执行该函数。这个函数通常被命名为main(),并且依据语言标准具有特定的返回类型和参数。另一方面,Python解释器从文件顶部开始执行脚本,并且没有自动执行的特殊函数。
程序员皮克
2021/12/29
4K0
Python在日常中的使用
今天想要整理下电脑硬盘的文件,只要一些有用的方便共享,然后发现文件组织结构是这个样子的
数据处理与分析
2019/07/31
9.5K0
Python在日常中的使用

相似问题

Python3中的Pinging服务器

11

在python中Pinging网络设备

119

在C++中Pinging服务器

10

Python pinging本地IP

111

在Java中更快地Pinging服务器?

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档