经过大量的手工操作,我创建了XPath表达式,从被解析的网站HTML中检索到近100家公司在其中设有办公室的城市。直到很晚,我才意识到,这些城市的邮政编码将是优秀和独特的。
我意识到没有一段额外的XPath代码可以覆盖所有情况,但是是否有一些通用表达式可以合理地检索同一名称空间或附近名称空间中的5位数字(或5位数字、连字符和4位数字),假设邮政编码出现在城市之后。
例如,代码
//div[@class='content']//h5
可能会添加一些类似"and \\d{5}"
的内容,我不熟悉XPath,并且使用regex语法,反斜杠用于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“。
我在Windows 8上使用XML1.0(根据2013年的一篇文章,没有XML2.0)。
对评论的回应:以下是我使用的代码示例。
doc <- htmlTreeParse("http://www.butlersnow.com/Contact_Us.aspx", useInternal = TRUE)
xpathSApply(doc, "//div[@class='content']//h5", xmlValue, trim = TRUE)
发布于 2014-08-14 05:44:59
所以我们已经发现你
我们尚未确定的是,这个模块在R语言中支持哪个版本的XPath。要么它只符合XPath 1.0标准(更有可能),要么它也支持XPath 2.0。
为什么这是相关的?这是相关的,因为只有XPath 2.0提供了可以处理正则表达式的函数。Regexes是为了解决您所描述的问题,即在任意字符串中找到一行5位数字。现在,如何找出支持哪个版本?只需使用仅在XPath 2.0中可用的函数,例如tokenize()
,并查看这是否会引发错误。
选项1:这个R功能最终支持XPath 2.0
首先,确定可能包含邮政编码的元素。例如,假设它在h5
元素中。然后,将matches()
函数与正则表达式一起使用。
//h5[matches(.,'\d{5}')]
或者稍微改变一下。当然,R不能区分实际的邮政编码和其他仅仅由一行5位数字组成的东西。
选项2:只有XPath 1.0可供您使用
然后,在我看来,没有合理的方法将其组合成一个XPath表达式,因为regexes是不可用的。但是,R本身恰好是擅长正则表达式。使用XPath从HTML中提取所有相关字符串,然后在R、XPath外部用正则表达式搜索它们。
注意:所有这些都不能以任何方式“证明”像这样简单的正则表达式是精确的和限制性的,足以只找到ZIP代码。在大量的HTML文档集合中,可能会有许多“假阳性”无法与“真实”的点击区分开来。然后,您必须改进该方法,例如,根据ZIP代码数据库检查结果。
因为我无论如何都在写作,所以没有所谓的“附近的命名空间”。您将XPath中的上下文项误认为是命名空间。在下面的示例中,http://www.ns.com
是一个命名空间。
<ns:root xmlns:ns="http://www.ns.com">
<ns:a/>
</ns:root>
https://stackoverflow.com/questions/25297142
复制