提取网页的一部分亲爱的社区成员,
我正在尝试从又长又乱的字符串中提取一段文本。 我想提取 YouTube 视频的描述部分。
例如,在这个视频中: https://youtu.be/yvoddqG-lm8我想只提取描述部分:
“Mia Stephens 展示了如何在 JMP 中执行基本统计分析。 她介绍了如何使用分布一次分析一个变量的数据。 使用 Fit Y by X 进行涉及两个变量的分析,使用拟合模型进行涉及两个以上变量的分析。 她还审查了用于汇总和绘制数据图表的工具。 该视频的第三部分是学习使用 JMP 的基础知识的系列视频,以充分利用 JMP 30 天免费试用版或新的 JMP 许可证。 JMP 学术大使 Mia Stephens 演示了如何浏览 JMP 菜单和数据表、将数据导入 JMP、汇总数据并绘制图表以及执行基本统计分析。 该演示使用将于 9 月推出的 JMP 11。 查看 JMP 11 中的新功能: http://www.jmp.com/software/preview-j...”
我设法使用以下命令将整个网页脚本作为字符串获取:
page = open (https://youtu.be/yvoddqG-lm8);
我注意到我正在查看的描述部分在页面中出现了几次。 特别是在这些条款之后:
\\!"描述\\!":{\\!"运行\\!":[{\\!"文本\\!":\\!"
或者: \\!"description\\!":{\\!"simpleText\\!":\\!"
有什么建议 ?
我提取整个页面代码的方向是否正确,或者有没有办法直接提取我正在寻找的部分?
谢谢。
回复:提取网页的一部分-缺少某些内容@LNitz - YouTube API可能有帮助。 此页面上的信息可能与显示的不完全一样,因为下载的 YouTube HTML 似乎在过去一年左右发生了变化。
我认为您想要创建一个 JMP 数据表,添加所需的列,然后使用 for 循环或列公式来填充表中的行。
回复:提取网页的一部分我已经尝试过这个简洁的程序并且运行它没有错误。但是,我不知道如何嵌入它,以便将我恢复的文本发布到 JMP 文件中。当我运行此文件或指向不同网页的稍有不同的版本时,我定义的文件(称为 Page)不会从网页接收任何数据。
这是我的代码(包括原始源文件作为注释):
/*page = open ("https://youtu.be/yvoddqG-lm8");;*/
page = Open( "https://www.theatlantic.com/ideas/archive/2021/07/republicans-anti-history-marjorie-taylor-greene/619403" );
division = Regex( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
回复:提取网页的一部分如果您不介意向工具箱添加新工具(并且希望避免使用正则表达式解析 HTML 的复杂性),您可以利用 JMP 的 Python Bridge(这里是帮助程序将其与 Anaconda 的发行版一起使用)并使用为处理 HTML 解析而构建的包,例如美丽的汤。
这个包有很多文档和例子因此,一旦您弄清楚如何在 JMP 和 Python 之间传输数据(详细信息这里)您可以专注于要提取的内容,然后在 JMP 中对其进行处理。
回复:提取网页的一部分伟大的!
对于任何正在阅读的人:在顶部, @马克贝利介绍了不情愿的?操作员:
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
我将其回收为.*?但这是相同的想法并且非常重要。 这?下列的+或者*使+或者*不情愿的代替贪婪的。 + 表示一个或多个和*方法零个或多个其左侧的任何内容......在本例中是一个句点。 时期匹配任何东西。 贪婪的意味着*或者+将重复。 (匹配任何字符)一直到字符串末尾,大约 50,000 个字符。 在上面的例子中,正则表达式仍然需要找到” > 。 它无法在文本末尾匹配,因此正则表达式开始释放贪婪获取的字符,一次一个,测试” > 。很有可能会发现” >属于字符串末尾附近的其他一些带引号的字符串,并最终接受您想要的文本以及一堆额外的文本。
在里面不情愿的版本, .*?最初匹配零个字符,但没有找到” > 。 所以正则表达式推动.*?前进一个字符并再次测试。 不情愿的会找到下一个” > ,而不是靠近文本末尾的一个。
往往贪婪行为和不情愿行为会得到相同的答案,而且贪婪的速度更快。 但在这个例子中,答案是不同的,不情愿的速度更快(因为它会不情愿地前进几十个字符,而贪婪的情况可能必须前进数千个字符,然后备份其中的大多数字符。)
回复:提取网页的一部分谢谢@Craige_Hales
这一击,犹如闪电一般!准确提取我想要的内容,并且在不同的 YouTube 页面上都很强大。
这是我的最终版本
New Table( "Video list",
Add Rows( 3 ),
New Script(
"bring description from YouTube",
For( i = 1, i <= N Rows(), i++,
page = Open( :link[i] );
division = Regex(
page,
"<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>", "", globalreplace );
:webpagetext[i] = withouttags;
)
),
New Column( "Video",
Character,
"Nominal",
Set Values(
{"Getting Started With JMP, Part 1", "Getting Started With JMP, Part 2",
"Getting Started With JMP, Part 3"}
)
),
New Column( "Link",
Character( 83 ),
"Nominal",
Set Values(
{
"https://www.youtube.com/watch?v=xge-f1KV_oc&list=PL411D719858B57C47&index=2&t=5s",
"https://www.youtube.com/watch?v=xhZVuDrKiEA&list=PL411D719858B57C47&index=3&t=0s",
"https://www.youtube.com/watch?v=1M8LzJ8bjwg&list=PL411D719858B57C47&index=4&t=0s"
}
)
),
New Column( "webpagetext", Character, "Nominal", Set Values( {"", "", ""} ) )
)回复:提取网页的一部分您正在尝试从 javascript json 片段中获取文本。 我认为从 HTML 往下获取它会更容易。 我在用着 。代替引号只是为了避免 \ 转义。 这个
...
之所以有效,是因为这个 ...
中没有嵌套的 ,这会使其提前结束。 正则表达式本身不处理嵌套结构(但模式匹配可以)。
请注意,div 的 id= 正在标识您想要的文本,因此它在一段时间内可能相当强大。
page = open ("https://youtu.be/yvoddqG-lm8");
division = Regex ( page, "<DIV id=".watch-description-text." class="..">(.*?)</DIV>]*>","",globalreplace);“Mia Stephens 展示了如何在 JMP 中执行基本统计分析。 她介绍了如何使用分布一次分析一个变量的数据。 使用 Fit Y by X 进行涉及两个变量的分析,使用拟合模型进行涉及两个以上变量的分析。 她还回顾了用于汇总和绘制数据图表的工具。该视频是第三部分,是学习使用 JMP 的基础知识的系列视频,以充分利用 JMP 30 天免费试用版或新的 JMP 许可证。 JMP 学术大使 Mia Stephens 演示了如何浏览 JMP 菜单和数据表、将数据导入 JMP、汇总数据并绘制图表以及执行基本统计分析。 该演示使用将于 9 月推出的 JMP 11。 查看 JMP 11 中的新功能: http://www.jmp.com/software/preview-j ……”
回复:提取网页的一部分谢谢@马克贝利为您提供解决方案。 它很强大,因为它可以从我尝试过的任何 YouTube 视频中检索干净的字符串。 然而,它带来了描述的缩短版本(事实证明,每个视频的代码包含两次完整描述和 3 次简短描述)。
尝试修改正则表达式命令,我不确定为什么它们不能像你的那样工作。 你注意到我的脚本有什么问题了吗?
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
// this works well for the short version of the description.
final = Regex ( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
// not working for the long version of the description.
final = Regex ( page, "description\\!":{\!"simpleText\!":\!"(.+?)\\!"},", "\1" );
回复:提取网页的一部分谢谢你, @tx尼尔森为了好的方向。 使用最基本的字符函数我已经成功做到了这一点:
Names Default To Here( 1 );
page = open ("https://youtu.be/yvoddqG-lm8");
startingpoint = Contains( page, "description\\!":{\\!"simpleText\\!":\\!"" );
rightremain = Substr( page, startingpoint + 32, Length( page ) );
endpoint = Contains( rightremain, "\\!"},\\!"lengthSeconds" );
final = Substr( rightremain, 0, endpoint - 1 );
Show( final );
此时,当我尝试将其复制到其他 YouTube 页面时,我发现完整描述的前缀和后缀有些不一致,因此我必须使用各种前缀和后缀来找到每个页面的正确起点和终点。
回复:提取网页的一部分不久前: Twitter 屏幕抓取和基于 FFT 的交叉淡入淡出
它使用一个非常简单的正则表达式来定位图像的 URL:
x = Load Text File( "https://twitter.com/search?q=football&src=typd" );//cat%20OR%20dog%20OR%20turtle%20OR%20rabbit
Pat Match( x, // look for links to jpgs in the html
Pat Regex( "https://[^\!"']+?\.jpg" ) >> link + Pat Test(
// reject some links to small images and duplicates
If( !Contains( link, "bigger" ) & !Contains( link, "normal" ) & duplicate << Contains( link ) == 0,
duplicate[link] = 1; // remember this keeper
dt << addrows( 1 ); // make a row for it
dt:url = link;
dt << runformulas;// make sure it loads
);
1;
) + Pat Fail()// this forces the match to keep trying, recording all links
);
它会循环,不使用 PatRepeat,而是使用 PatFail()。 PatFail 永远不会匹配并导致匹配器在下一个位置重试。 每次它发现https://<不带 ! 的文本" 或 ' >.jpg它运行一些 JSL 来处理 URL。
刚刚尝试了一下,显然足球仍然是一个可行的搜索词。 第一次查询时您将获得大约 20 张图片,此后每隔几分钟左右就会获得一张新图片。
Mark 的做法是正确的,使用 HTML 标签来标识您想要的内容。
回复:提取网页的一部分我喜欢@tx尼尔森建议。 您还可以在字符串上使用正则表达式。 你可以偷,呃,我是说学习文本资源管理器中 HTML 标签的正则表达式。 在任何包含字符数据的列上启动它。 (您并没有真正分析此处的文本。)单击平台顶部的红色三角形并选择解析选项 > 自定义正则表达式。 有几种与 HTML 相关的表达式。 单击表达式列表下方的添加按钮 (+) 以转至库。 添加那些有前途的名字。 编辑器将允许您检查和修改表达式。 您将通过顶部的示例文本或定义中的示例获得即时反馈。
这可能很简单:
Names Default to Here( 1 );
page = Load Text File( "https://youtu.be/yvoddqG-lm8" );
description = Regex( page, "<meta name="\!"description\!"" content="\!"(.+?)\!"" />", "\1" );
就像我说的,我喜欢之前的建议。 但有选择是件好事。
回复:提取网页的一部分罗恩,
我已经按照您似乎需要的顺序编写了几个解析器。我通常不使用 Open() 函数,但我使用 Loat Text File() 将文件读入长字符串。然后,我使用 Contains() 到达起点,并使用 Substr() 获取从 Contains() 返回的偏移量之后的所有字符的字符串。 由于您正在阅读 HTML 文件,因此您可以使用其标记语言的结构来配置起点和分隔符。
祝你好运