【发布时间】:2012-12-04 01:42:35
【问题描述】:
我正在尝试解析像this one 这样的页面,我只是想获取标题之后的段落,我猜是介绍。
我想要<table class="infobox vcard"> 和<table id="toc"> 之间的所有内容(包括段落标签)。使用简单的 CSS 选择器来获取第一段:
div#bodyContent div#mw-content-text.mw-content-ltr p
并不总是有效,因为有时信息框表中的某些内容有一个段落。此外,介绍性段落的数量也会有所不同。如果有人有比我在这里想要的更好的方法,我也会接受。
--
请求的附加代码,尽可能缩短:
require HTTP::Request;
require LWP::UserAgent;
use LWP::Simple;
use HTML::Query 'Query';
my $pageurl = "http://en.wikipedia.org/wiki/Wayne_Rooney";
my $wikiurl = URI->new($pageurl);
my $wikirequest = HTTP::Request->new(GET => $wikiurl);
my $wikiua = LWP::UserAgent->new;
my $wikiresponse = $wikiua->request($wikirequest);
my $pagetoparse = $wikiresponse->content;
my $q2 = Query(text => $pagetoparse);
my @wikiintro = $q2->query('div#bodyContent div#mw-content-text.mw-content-ltr p')->get_elements();
my $pageintro;
if(@wikiintro) {
if(index($wikiintro[0]->as_text(), "Appearances (Goals)") != -1){
$pageintro = $wikiintro[1]->as_text();
} else {
$pageintro = $wikiintro[0]->as_text();
}
} else {
$pageintro = "unavailable";
}
【问题讨论】:
-
我说了我尝试过的:“使用简单的 CSS 选择器来获取第一段:”是我试图获取介绍段的内容,我说为什么这不起作用以及为什么即使它确实我想要其他段落。就试图弄清楚如何处理 div 之间的事情而言,我已经用谷歌搜索了多个不同的查询,但我无法想出任何东西。
-
你能给我们看一些代码吗?您使用了哪些模块?如果您使用的是Mojolicious Useragend,可能会有一些技巧来获得正确的输出。
-
我将提供我现在正在做的事情的代码,但我应该重复一遍:我正在做的只是第一段。我找到了一种方法来避免有时会在表格中选择带有“信息框”类的段落的问题,您可以在代码中看到该段落。但是,我仍然认为这不是正确的方法,因为我认为我无法获取其他段落并知道何时停止(当表 id 为“toc”时)开始。
-
换句话说,它与我想要做的事情几乎完全无关,在我弄清楚如何获得中间元素之前,它更像是一个占位符。
标签: perl css-selectors html-parsing