使用 DOMXpath 查找不太好的数据 html
Using DOMXpath to find data in not so nice html
我正在尝试从植物列表网站获取一些数据。这证明有点问题,因为它们的 html 格式不正确。这是搜索结果中的两行(免责声明:我不对此代码负责):
<tr>
<td>
<i class="glyphicons-icon leaf"></i>
</td>
<td>
<a title="Cimicifuga simplex" href="/taxon/wfo-0000604773" class="result">
<h4 class="h4Results"><em>Cimicifuga simplex</em>(DC.) Wormsk. ex Turcz.</h4>
</a>
Bull. Soc. Imp. Naturalistes Moscou<br/>
<div>
<em>Status:</em><span id="entryStatus">Synonym of </span>
<a href="/taxon/wfo-0000519124"><em>Actaea simplex</em>(DC.) Wormsk. ex Prantl</a>
</div>
<div>
<em>Rank:</em><span id="entryRank">Species</span>
</div>
<div>
<em>Family:</em> Ranunculaceae
</div>
</td>
<td>
<img title="No Image Available" src="/css/images/no_image.jpg" class="thumbnail pull-right"/>
</td>
</tr>
<tr>
<td>
<i class="glyphicons-icon leaf"></i>
</td>
<td>
<a title="Actaea simplex" href="/taxon/wfo-0000519124" class="result">
<h4 class="h4Results"><strong><em>Actaea simplex</em>(DC.) Wormsk. ex Prantl</strong></h4>
</a>
Bot. Jahrb. Syst.<br/>
<div>
<em>Status:</em><span id="entryStatus">Accepted Name</span>
</div>
<div>
<em>Rank:</em><span id="entryRank">Species</span>
</div>
<div>
<em>Family:</em> Ranunculaceae</div>
<div>
<em>Order:</em> Ranunculales
</div>
</td>
<td>
<img title="No Image Available" src="/css/images/no_image.jpg" class="thumbnail pull-right"/>
</td>
</tr>
我自己加了一些布局,不然看不懂。
无论如何,我在 php 和 DOMXpath 中加载了页面,现在我想得到两件事:
- Select 包含 Accepted Name 的行
- 从中得到物种名称和对应的link
在这种情况下,结果将是“Actaea simplex”和“/taxon/wfo-0000519124”。请注意,会有更多类似第一行的结果,而且我要查找的行的位置不一定是第二行。
通常我只是尝试,使用 google 并尝试更多,最后我到达那里,但在这种情况下,ID 被用作 类,并且不是唯一的。这使得无法使用 Xpath 测试器,甚至可能对 DOMXpath 毫无用处。
那么,是否可以使用 DOMXpath 获取我的数据,如果可以,我应该使用什么查询?
试试这样的东西:
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$target = $xpath->query("//td[.//span[.='Accepted Name']]/a");
$link = $target[0]->getAttribute('href');
$title = $target[0]->getAttribute('title');
echo $title," ",$link;
输出
Actaea simplex /taxon/wfo-0000519124
我正在尝试从植物列表网站获取一些数据。这证明有点问题,因为它们的 html 格式不正确。这是搜索结果中的两行(免责声明:我不对此代码负责):
<tr>
<td>
<i class="glyphicons-icon leaf"></i>
</td>
<td>
<a title="Cimicifuga simplex" href="/taxon/wfo-0000604773" class="result">
<h4 class="h4Results"><em>Cimicifuga simplex</em>(DC.) Wormsk. ex Turcz.</h4>
</a>
Bull. Soc. Imp. Naturalistes Moscou<br/>
<div>
<em>Status:</em><span id="entryStatus">Synonym of </span>
<a href="/taxon/wfo-0000519124"><em>Actaea simplex</em>(DC.) Wormsk. ex Prantl</a>
</div>
<div>
<em>Rank:</em><span id="entryRank">Species</span>
</div>
<div>
<em>Family:</em> Ranunculaceae
</div>
</td>
<td>
<img title="No Image Available" src="/css/images/no_image.jpg" class="thumbnail pull-right"/>
</td>
</tr>
<tr>
<td>
<i class="glyphicons-icon leaf"></i>
</td>
<td>
<a title="Actaea simplex" href="/taxon/wfo-0000519124" class="result">
<h4 class="h4Results"><strong><em>Actaea simplex</em>(DC.) Wormsk. ex Prantl</strong></h4>
</a>
Bot. Jahrb. Syst.<br/>
<div>
<em>Status:</em><span id="entryStatus">Accepted Name</span>
</div>
<div>
<em>Rank:</em><span id="entryRank">Species</span>
</div>
<div>
<em>Family:</em> Ranunculaceae</div>
<div>
<em>Order:</em> Ranunculales
</div>
</td>
<td>
<img title="No Image Available" src="/css/images/no_image.jpg" class="thumbnail pull-right"/>
</td>
</tr>
我自己加了一些布局,不然看不懂。
无论如何,我在 php 和 DOMXpath 中加载了页面,现在我想得到两件事:
- Select 包含 Accepted Name 的行
- 从中得到物种名称和对应的link
在这种情况下,结果将是“Actaea simplex”和“/taxon/wfo-0000519124”。请注意,会有更多类似第一行的结果,而且我要查找的行的位置不一定是第二行。
通常我只是尝试,使用 google 并尝试更多,最后我到达那里,但在这种情况下,ID 被用作 类,并且不是唯一的。这使得无法使用 Xpath 测试器,甚至可能对 DOMXpath 毫无用处。
那么,是否可以使用 DOMXpath 获取我的数据,如果可以,我应该使用什么查询?
试试这样的东西:
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$target = $xpath->query("//td[.//span[.='Accepted Name']]/a");
$link = $target[0]->getAttribute('href');
$title = $target[0]->getAttribute('title');
echo $title," ",$link;
输出
Actaea simplex /taxon/wfo-0000519124