perl – 在使用Mojo :: DOM时精确定位子元素

perl – 在使用Mojo :: DOM时精确定位子元素,第1张

概述我正在尝试使用 WWW::Mechanize和 Mojo::DOM从旧的vBulletin论坛中提取文本. vBulletin不使用HTML和CSS进行语义标记,而且我在使用Mojo :: DOM->孩子来获取某些元素时遇到了麻烦. 这些vBulletin帖子的结构取决于其内容. 单个消息: <div id="postid_12345">The quick brown fox jumps over 我正在尝试使用 WWW::MechanizeMojo::DOM从旧的vBulletin论坛中提取文本.

vBulletin不使用HTML和CSS进行语义标记,而且我在使用Mojo :: DOM->孩子来获取某些元素时遇到了麻烦.

这些vBulletin帖子的结构取决于其内容.

单个消息:

<div ID="postID_12345">The quick brown fox jumps over the lazy dog.<div>

单个消息引用另一个用户:

<div ID="postID_12345">    <div>    <table>        <tr>            <td>            <div>Quote originally posted by Bob</div>            <div>Everyone kNows the sky is blue.</div>            </td>        </tr>    </table>    </div> I disagree with you,Bob. It's obvIoUsly green.</div>

带有剧透的单个消息:

<div ID="postID_12345">    <div >Yoda is Luke's father!</div></div>

单个消息引用另一个用户,带有剧透:

<div ID="postID_12345">    <div>    <table>        <tr>            <td>            <div>Quote originally posted by Fred</div>            <div >Yoda is Luke's father!</div>            </td>        </tr>    </table>    </div>    <div >No waaaaay!</div></div>

假设上面的HTML和一个包含必要帖子ID的数组:

for (@post_IDs) {    $mech->get($full_url_of_specific_forum_post);    my $dom = Mojo::DOM->new($mech->content);    my $div_ID = 'postID_' . $_;    say $dom->at($div_ID)->children('div')->first;    say $dom->at($div_ID)->text;}

使用$dom-> at($div_ID) – > all_text可以在一条连续的行中提供所有内容,这使得很难分辨帖子中的引用内容和原始内容.

使用$dom-> at($div_ID) – >文本会跳过所有子元素,因此不会选择带引号的文本和剧透.

我尝试了$dom-> at($div_ID) – > children(‘div’) – >的变体,但这给了我一切,包括HTML.

理想情况下,我希望能够获取每个帖子中的所有文本,每个子元素都在自己的行中,例如

POSTID12345: + Quote originally posted by Bob + Everyone kNows the sky is blue.  I disagree with you,Bob. It's obvIoUsly green.

我是Mojo的新手,并且和Perl一起生气.我想自己解决这个问题,但在查看文档并摆弄它几个小时之后,我的脑子就变得糊里糊涂了,我很茫然.我只是没有得到Mojo :: DOM和Mojo :: Collections如何工作.

任何帮助将不胜感激.

解决方法 查看Mojo :: DOM的源代码,基本上 all_text method递归遍历DOM并提取所有文本.使用该源编写自己的DOM函数.它的递归函数依赖于返回单个字符串,在你的函数中你可能会返回一个数组,其中包含你需要的任何上下文.

编辑:

在对IRC进行一些讨论之后,网页抓取示例已经更新,它可以帮助您指导您. http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Web_scraping

总结

以上是内存溢出为你收集整理的perl – 在使用Mojo :: DOM时精确定位子元素全部内容,希望文章能够帮你解决perl – 在使用Mojo :: DOM时精确定位子元素所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1242183.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存