Java 使用XPath从BBC网站进行web爬网

Java 使用XPath从BBC网站进行web爬网,java,dom,xpath,web-crawler,Java,Dom,Xpath,Web Crawler,这是我试图抓取的一个典型网页的示例 如果您检查网页的元素。主文在下面 <div class="story-body"> 我无法获取文章内容。在数据库中,该字段中显示null 我已经成功地从路透社抓取了一些页面,所以function getXPathValue应该是正确的 我使用http请求获取页面。我不知道这是否是问题所在 问题在于您正在对XHTML页面(或者至少是XHTML名称空间中的文档)进行爬网。HTML和XHTML之间最显著的区别在于XHTML文档有一个默认名称空间: &

这是我试图抓取的一个典型网页的示例

如果您检查网页的元素。主文在下面

<div class="story-body">
我无法获取文章内容。在数据库中,该字段中显示null

我已经成功地从路透社抓取了一些页面,所以function getXPathValue应该是正确的


我使用http请求获取页面。我不知道这是否是问题所在

问题在于您正在对XHTML页面(或者至少是XHTML名称空间中的文档)进行爬网。HTML和XHTML之间最显著的区别在于XHTML文档有一个默认名称空间:

<root xmlns="www.example-of-default-namespace.com"/>
将永远找不到此元素,因为它位于命名空间中


XHTML文档也是如此。有两种方法可以解决这个问题

注册XHTML命名空间

第一个更合适的解决方案是在代码中注册或声明XHTML名称空间,然后在XPath表达式中使用前缀。由于您没有显示任何代码,我很难对此发表评论,我们甚至不知道编程语言

忽略名称空间

其次,通过将XPath表达式修改为,可以忽略任何名称空间

//*[local-name() = 'div' and @class='story-body']
这里,
*
是任何(或无)名称空间中任何元素的通配符,
local-name()
返回元素或属性名称的本地部分。在XML中,有以下限定名称:

prefix:root
此限定名称的第一部分是前缀,第二部分是此元素的本地名称。因此,
本地名称(前缀:root)
的结果是
root


还请注意,我已将“div”小写。HTML可能不区分大小写,但XHTML、扩展名XML和扩展名XPath不区分大小写。

请显示您的代码,并用正确的编程语言标记问题。尝试
//DIV[@class='story-body']/p/text()
获取DIV的内容。我正在使用nutch进行web爬网。所以我也在使用java开发nutch插件。请告诉我第一个解决方案。对于第二个解决方案,本地名称的含义是什么?以及“*”的含义。谢谢大家!@你必须分享你的代码,并重新标记问题。但在此之前,请尝试第二种解决方案,并让我知道它是否有效。我将编辑我的答案,并对其进行更多的解释。谢谢您,我为您的回答添加了java代码reference@hao其他可能的问题是:您正在查找的内容是由javascript生成的,或者内容实际上不在该分区中。请尝试
/*[local-name()='div'和@class='story-body']/*[local-name()='p']
。很抱歉,它不起作用。但是谢谢你的努力!
//*[local-name() = 'div' and @class='story-body']
prefix:root