提取松耦合结构维基百科文本。 HTML(extract loosly structured wi

2019-10-22 19:07发布

一些在维基百科页面歧义的HTML的是,我们应该说,暧昧的,即连接到名为特定的人的联系有Corzine难以捕捉使用jsoup因为他们没有明确的结构,也不会生活在一个特定部分作为在这个例子中 。 看到页面在这里克辛页 。

我怎样才能让他们的联系呢? 是jsoup此任务的合适工具?

也许我应该用正则表达式,但我担心这样做,因为我希望它是普及应用。

</b> may refer to:</p> 
 <ul> 
  <li><a href

^这这里是标准的,也许我可以使用正则表达式来匹配?

<p><b>Corzine</b> may refer to:</p> 
 <ul> 
  <li><a href="/wiki/Dave_Corzine" title="Dave Corzine">Dave Corzine</a> (born 1956), basketball player</li> 
  <li><a href="/wiki/Jon_Corzine" title="Jon Corzine">Jon Corzine</a> (born 1947), former CEO of <a href="/wiki/MF_Global" title="MF Global">MF Global</a>, former Governor on New Jersey, former CEO of <a href="/wiki/Goldman_Sachs" title="Goldman Sachs">Goldman Sachs</a></li> 
 </ul> 
 <table id="setindexbox" class="metadata plainlinks dmbox dmbox-setindex" style="" role="presentation"> 

理想的输出将是

Dave Corzine
Jon Corzine

也许将有可能相匹配的部</b> may refer to:</p>并且还<table id="setindexbox"并提取之间的所有这英寸 我想<table id="setindexbox"可以容易地匹配足够jsoup,但</b> may refer to:</p>应该更difficule因为<b><p>不是非常杰出的。


我尝试这样做:

      Elements table = docx.select("ul");
      Elements links = table.select("li");



    Pattern ppp = Pattern.compile("table id=\"setindexbox\" ");
    Matcher mmm = ppp.matcher(inputLine);

    Pattern pp = Pattern.compile("</b> may refer to:</p>");
    Matcher mm = pp.matcher(inputLine);
    if (mm.matches()) 
    {
    while(!mmm.matches())
      for (Element link: links) 
      {
          String url = link.attr("href");
          String text = link.text();
          System.out.println(text + ", " + url);
      }
    }

但没有奏效。

Answer 1:

这个选择的工作原理:

Elements els = doc.select("p ~ ul a:eq(0)");

请参阅: http://try.jsoup.org/~yPvgR0pxvA3oWQSJte4Rfm-lS2Y

这就是寻找第一A元素( a:eq(0)在一个ul这是一个的同级p 。 你也可以做p:contains(corzine) ~ ul a:eq(0)如果有其他冲突。

或者更一般: :contains(may refer to) ~ ul a:eq(0)

这很难,因为它是非结构化的概括维基百科。 但恕我直言这是容易当模板转换等使用的解析器和CSS选择器比正则表达式,特别是随着时间的推移



文章来源: extract loosly structured wikipedia text. html