提取结构松散的维基百科文本。 html
extract loosly structured wikipedia text. html
维基百科消歧页面上的一些 html 应该说是模棱两可的,即那里连接到名为 Corzine
的特定人物的链接很难使用 jsoup 捕获,因为它们是结构不明确,也不像 this example. See the page Corzine page here.
中那样位于特定部分
我怎样才能得到它们? 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>
应该更困难,因为 <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);
}
}
但是没用。
这个选择器有效:
Elements els = doc.select("p ~ ul a:eq(0)");
参见:http://try.jsoup.org/~yPvgR0pxvA3oWQSJte4Rfm-lS2Y
这是在 ul
中寻找第一个 A 元素 (a:eq(0)
),它是 p
的同级元素。如果还有其他冲突,你也可以p:contains(corzine) ~ ul a:eq(0)
。
或者更笼统地说::contains(may refer to) ~ ul a:eq(0)
很难概括维基百科,因为它是非结构化的。但恕我直言,使用解析器和 CSS 选择器比使用正则表达式更容易,尤其是随着时间的推移,当模板发生变化等时
维基百科消歧页面上的一些 html 应该说是模棱两可的,即那里连接到名为 Corzine
的特定人物的链接很难使用 jsoup 捕获,因为它们是结构不明确,也不像 this example. See the page Corzine page here.
我怎样才能得到它们? 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>
应该更困难,因为 <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);
}
}
但是没用。
这个选择器有效:
Elements els = doc.select("p ~ ul a:eq(0)");
参见:http://try.jsoup.org/~yPvgR0pxvA3oWQSJte4Rfm-lS2Y
这是在 ul
中寻找第一个 A 元素 (a:eq(0)
),它是 p
的同级元素。如果还有其他冲突,你也可以p:contains(corzine) ~ ul a:eq(0)
。
或者更笼统地说::contains(may refer to) ~ ul a:eq(0)
很难概括维基百科,因为它是非结构化的。但恕我直言,使用解析器和 CSS 选择器比使用正则表达式更容易,尤其是随着时间的推移,当模板发生变化等时