Php 用于html解析的Dom和xpath查询

Php 用于html解析的Dom和xpath查询,php,dom,xpath,Php,Dom,Xpath,我正在尝试编写一个机器人,它将每天提取html并对其进行解析。 现在,对于解析html,我可以只使用字符串函数,如explode或regural表达式,但我发现dom xpath代码更干净,因此现在我可以对所有需要爬行的站点和需要剥离的标记进行配置,如: 'http://examplesite.com' => '//div/a[@class="articleDesc"]/@href' 代码如下所示 @$dom->loadHTML($html); $xpath = new D

我正在尝试编写一个机器人,它将每天提取html并对其进行解析。 现在,对于解析html,我可以只使用字符串函数,如explode或regural表达式,但我发现dom xpath代码更干净,因此现在我可以对所有需要爬行的站点和需要剥离的标记进行配置,如:

'http://examplesite.com' => '//div/a[@class="articleDesc"]/@href'
代码如下所示

    @$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tags = $xpath->query('//body/div[@class="articleDesc"]');


foreach ($tags as $tag) 
    echo $tag->nodeValue . "\n";
因此,我得到了所有带有类文章描述的div标记,这很好。但是我注意到div标记中的所有html标记都被剥离了。 我想知道我怎么才能得到我正在看的那个节目的全部内容

我还发现很难看到任何关于$xpath->query()的正确文档,以了解如何形成字符串。php网站并没有透露它的确切结构。不过,我的主要问题是我尝试使用

试用


这也应该加载所有的内部标记。虽然不是DOM,但它们可以互换。稍后您可以
dom\u import\u simplexml
将其重新绑定到dom中

$xml=simplexml_load_string($html);
$tags=$xml->xpath('//body/div[@class="articleDesc"]');

这也应该加载所有的内部标记。虽然不是DOM,但它们可以互换。稍后您可以
dom\u import\u simplexml
将其重新绑定到dom中

$xml=simplexml_load_string($html);
$tags=$xml->xpath('//body/div[@class="articleDesc"]');
答案很简单:

foreach ($tags as $tag) 
    echo $dom->saveXML($tag);
如果您想要html非压缩标记,xpath将是

//a[@class="articleDesc"]
假设a标记具有该类属性,简单的答案是:

foreach ($tags as $tag) 
    echo $dom->saveXML($tag);
如果您想要html非压缩标记,xpath将是

//a[@class="articleDesc"]


这是假设a标记具有该类属性

您可以使用这个很棒的蜘蛛框架(在Python中)

您可以使用这个很棒的蜘蛛框架(在Python中)

请参见及其对应的XPath 1.0规范:不,不适用于我。链接中的函数DOMinnerHTML($element)不适用于我的xpath objectGood xpath tutorial:See及其对应的xpath 1.0 specs:Nope,不适用于我。链接中的函数DOMinnerHTML($element)不适用于我的XPathObjectGood xpath教程:meh。。这在某种程度上是可行的,但对我来说,最好的方法是从“=>”//div/a[@class=“articleDesc”]/@href”获取匹配元素的html非压缩字符串列表。。。我想知道我是怎么做的,我可能会把你弄错,但这不只是要求你使用上面的函数之一,获取匹配XPath的父元素的innerHTML吗?我想不是。。。。匹配xpath的父元素的内部html将返回其中的所有html。但是,我想获得所有具有类article desc的div标记,例如……那么
echo getNodeInnerHTML($tag)
不是您想要的吗?如果是这样的话,我很难理解你到底想要什么。是否可以显示您的输入和所需输出的示例?meh。。这在某种程度上是可行的,但对我来说,最好的方法是从“=>”//div/a[@class=“articleDesc”]/@href”获取匹配元素的html非压缩字符串列表。。。我想知道我是怎么做的,我可能会把你弄错,但这不只是要求你使用上面的函数之一,获取匹配XPath的父元素的innerHTML吗?我想不是。。。。匹配xpath的父元素的内部html将返回其中的所有html。但是,我想获得所有具有类article desc的div标记,例如……那么
echo getNodeInnerHTML($tag)
不是您想要的吗?如果是这样的话,我很难理解你到底想要什么。是否可以显示您的输入和所需输出的示例?给出一个错误。expath不能使用$xml。如果我尝试在第二行之前使用$xml=dom\u import\u simplexml($xml),它将不起作用,因此出现正确的错误将很有帮助。第一行将
$html
字符串导入simplexml,如果不是字符串,请尝试
simplexml\u load\u file
。第二行直接从您的行复制,但转换为simplexml。诚然,我自己并没有运行过它,但这和我在工作中使用的代码是一样的,在那里它对我很有效
dom\u import\u simplexml($tags)
只应在加载simplexml后使用,并且假设您在dom中有一些您想对其进行的操作,否则它是不必要的,只是为了在加载结果后想要切换回dom而包括在内。simplexml\u load\u string($html)返回false,在我将其放入xpath()后返回false它当然坏了。。。它也给出了很多警告,比如:警告:simplexml_load_string()[function.simplexml load string]:实体:第36行:解析器错误:开始和结束标记不匹配:第8行和第25行的/usr/share/nginx/html/synd/robots/robot.php中的头我知道html可能不完美,这可能是simplexml返回false的原因,但这是一个正确的html网页,它在浏览器中呈现,因为你的html格式不好。虽然它不需要在浏览器中正确显示,但如果您希望在其上使用任何类型的解析器,它都是必需的。尝试关闭meta和head标签,然后重试。元标记是自动关闭的,所以只需在它们的末尾添加一个正斜杠,这很容易忘记。一旦你的html格式正确,它应该可以工作。给一个错误。expath不能使用$xml。如果我尝试在第二行之前使用$xml=dom\u import\u simplexml($xml),它将不起作用,因此出现正确的错误将很有帮助。第一行将
$html
字符串导入simplexml,如果不是字符串,请尝试
simplexml\u load\u file
。第二行直接从您的行复制,但转换为simplexml。诚然,我自己并没有运行过它,但这和我在工作中使用的代码是一样的,在那里它对我很有效
dom\u import\u simplexml($tags)
仅应在加载simplexml后使用,并且假设您在dom中有一些您想对其进行的操作,否则它是不必要的,只是在加载结果后想要切换回dom的情况下才包括在内。simplexml\u load\u string($html)返回false并在I p之后返回