【发布时间】:2014-08-13 22:17:36
【问题描述】:
经过大量手动工作,我创建了 XPath 表达式,可以从解析的网站 HTML 中检索近 100 家公司在其中设有办事处的城市。到了很晚,我才恍然大悟,这些城市的邮政编码会非常出色且与众不同。
我意识到没有任何一条额外的 XPath 代码可以涵盖所有情况,但是是否有一些通用表达式可以合理地经常在同一行或附近检索 5 个数字(或 5 个数字、一个连字符和 4 个数字)命名空间[假设邮政编码在城市之后]?
例如代码
//div[@class='content']//h5
可能会添加类似"and \\d{5}" [我不擅长 XPath,并且正在使用带有反斜杠的 R 正则表达式语法 5 位且只有 5 位数字]。然后我可以快速粘贴附加代码,看看它是否带回邮政编码,其余的由手工完成。
回应评论:
这是数百个 HTML 代码之一:
<div class="container">
<script type="text/javascript">
<div class="header">
<table>
<tbody>
<tr>
<td class="bodywrap" valign="top">
<table width="100%" cellspacing="0" cellpadding="0" border="0">
<table class="body" width="100%" cellspacing="0" cellpadding="20" border="0">
<tbody>
<tr>
<td>
<table class="body" width="100%" cellspacing="3" cellpadding="0" border="0">
<tbody>
<tr valign="top">
<td width="50%">
<table width="100%" cellspacing="0" cellpadding="0">
<img border="0" src="/files/Office/ac28ef17-906a-4ed0-9850-0af853da6abe/Presentation/ceOfficeNameImage/t_NewYork.gif">
<br>
<br>
1251 Avenue of the Americas
<br>
New York, New York 10020
<br>
T:
<span class="skype_c2c_print_container notranslate">212.262.6700</span>
我已经尝试过这个 XPath 表达式,但没有成功。即使要提取“纽约”,我也希望能够提取“10020”。
我在带有 XML 1.0 的 Windows 8 上(根据 2013 SO 帖子,没有 XML 2.0)。
回应评论: 这是我使用的代码示例。
doc <- htmlTreeParse("http://www.butlersnow.com/Contact_Us.aspx", useInternal = TRUE)
xpathSApply(doc, "//div[@class='content']//h5", xmlValue, trim = TRUE)
【问题讨论】:
-
XPath 1.0 还是 2.0?您现有的 XPath 表达式是什么样的? HTML 是什么样的?
-
systemInfo() 说我正在运行其他附加包:[1] XML_3.98-1.1。我确实在问题中展示了一个 XPath 表达式;大约有 65 种变体——遍布整个地图。同样,HTML 因公司而异。该问题询问如何将 XPath 表达式添加到已找到地址节点的现有表达式中。
-
什么是“附近的命名空间”?您在什么环境中使用 XPath?我们需要查看 XPath 嵌入到 HTML 示例中的代码,而且至关重要的是。你如何期望任何人添加到未知的东西?
-
我添加了一个例子。我的术语可能在“附近的命名空间”上是错误的,但我认为这意味着返回城市的节点——所以地址的邮政编码很可能是“附近的”。
-
我很抱歉这么厚。我相信我的 XPath 来自 XML 的 R 程序版本。我编辑了问题以放入我的代码示例。