2011-03-13 65 views
2

我试图从wikipedia获得谚语的列表。无法找到正确的XPath表达式(到结果合并)

我打印的选择:

  • 的类别(如 “攻击”, “猿”)
  • 的谚语(如 “持久不负有心人”)
  • 的解释(如“他一直试图达到自己的目标,最终获得成功。你必须坚持下去。”)

但在加入他们以正确的方式很多困难。我想和像一个数组,结束了:

array(
    0 => array(
    'category' => 'aanval', 
    'proverb' => 'De aanval is de beste verdediging.', 
    'explanation' => array(
     0 => 'Je kunt in een strijd of ruzie beter zelf actie ondernemen dan afwachten.', 
    ) 
), 
    1 => array(
    'category' => 'aap', 
    'proverb' => 'Al draagt een aap een gouden ring, het is en blijft een lelijk ding.', 
    'explanation' => array(
     0 => 'Wie zich mooi aankleedt wordt daarmee zelf nog niet mooi.', 
     1 => 'Of: Wie zich kleedt als iemand van aanzien wordt daarmee nog niet aanzienlijk.', 
     2 => 'Of: Fraaie kleding en sieraden maken een lelijk mens niet mooi.' 
    ) 
), 
    2 => array(
    'category' => 'aap', 
    'proverb' => 'Als apen hoger klimmen willen, ziet men gauw hun blote billen.', 
    'explanation' => array(
     0 => 'Iemand die meer wil dan hij kan, maakt zich snel belachelijk.', 
    ) 
), 
); 

这是我现在使用的代码:

if ($x = urlToXpath($url, true)) 
{ 
    $keywords = array(); 
    foreach ($x->query('/html/body/div[3]/div[3]/h2/span[@class="mw-headline"]') as $node) 
    { 
    $keywords[] = trim($node->nodeValue); 
    } 

    $data = array(); 
    foreach ($x->query('/html/body/div[3]/div[3]/dl/dd/dl') as $node) 
    { 
    $proverbs = array(); 
    foreach ($x->query('dd[@style="font-weight: bold"] | dd/b', $node) as $childNode) 
    { 
     $proverbs[] = trim($childNode->nodeValue); 
    } 
    $descriptions = array(); 
    foreach ($x->query('dd[position()>1]/small', $node) as $childNode) 
    { 
     $descriptions[] = trim(preg_replace('/^((Ook|Of):)/i', '', $childNode->nodeValue)); 
    } 
    $data[] = array('proverbs' => $proverbs, 'descriptions' => $descriptions); 
    } 
} 
+0

问得好,+1。见我的XPath表达式,用于选择这三个希望每谚语节点的答案。我还定义了一个算法如何填充使用这个孩子或XPath表达式您的阵列。 – 2011-03-14 13:31:26

回答

1

使用XPath做到这一点,你可能需要选择每H2,然后this solution使用在之间选择所有含谚语节点。然后做samething在这些节点找到说明。

您可能会发现更容易下载页面的维基文本(例如,like this),并在文本行简单的文字解析这一进程。或者,如果没有,至少你应该使用action=render得到一个版本without all the skin-related HTML

0

此XPath表达式选择用于第一谚语的通缉(3)节点:

/html/body/div[3]/div[3]/h2[1]/span[@class="mw-headline"] 
| 
/html/body/div[3]/div[3]/h2[1]/following-sibling::dl[1]/dd/dl/dd[1]/b 
| 
/html/body/div[3]/div[3]/h2[1]/following-sibling::dl[1]/dd/dl/dd[2]/small 

的通缉第二谚语三个节点通过该XPath表达式(注意,仅仅是索引被选择从1增加到2

/html/body/div[3]/div[3]/h2[2]/span[@class="mw-headline"] 
| 
/html/body/div[3]/div[3]/h2[2]/following-sibling::dl[1]/dd/dl/dd[1]/b 
| 
/html/body/div[3]/div[3]/h2[2]/following-sibling::dl[1]/dd/dl/dd[2]/small 

...等等。

这给你一个好的算法来充实你的阵列 - 迭代指数:1,2,3,...直到一些指标K构建XPath表达式的评估没有选择任何节点 - 那么您完成。