【问题标题】:How to scrape "vague" information off a website?如何从网站上刮掉“模糊”的信息?
【发布时间】:2016-03-12 23:25:27
【问题描述】:

我正在尝试为我不拥有的网站创建一个“API”,并尝试从页面上抓取信息,但是我尝试了有关 stackoverflow 和其他有关 DOM 和正则表达式的位置的建议,这通常需要一个上下文或特定的 div id 标签,看起来这个网站不使用,只使用通用标签,有没有办法可以从网站上刮掉信息?

我会尝试抓取的 HTML 示例:

<div class="col-md-6">
 <strong style="font-weight:500;">Date Created</strong>
</div>
<div class="col-md-6">
  03-12-2016 4:08PM
div>

<div class="col-xs-6 col-md-2 text-center">
  <font style="font-size:22px;">
    Feb 12, 2016
  </font>
   <br />
<div style="color:#999;">join date</div>
</div>

我如何能够抓取创建日期(实际日期)和加入日期?我在网络编程方面不是那么先进,所以我找不到其他任何东西,我通常只使用 PHP。

【问题讨论】:

  • 如果你知道 python,有一个很棒的报废库 Beautiful Soup,它可以做到这一点。

标签: javascript php html regex web-scraping


【解决方案1】:

您的样本很差,所以这只是一个示例。

基于此 HTML 示例:

<html>
    <head><title>Test</title></head>
    <body>
        <div class="col-md-6">
            <strong style="font-weight:500;">Date Created</strong>
        </div>
        <div class="col-md-6">
            03-12-2016 4:08PM
        </div>
        <div class="col-xs-6 col-md-2 text-center">
            <font style="font-size:22px;">
            Feb 12, 2016
            </font>
            <br />
            <div style="color:#999;">join date</div>
        </div>
    </body>
</html>

我们使用DOMDocumentDOMXPath

$dom = new DOMDocument();
libxml_use_internal_errors( 1 );
$dom->loadHTML( $html );
$xpath = new DOMXPath( $dom );

然后我们搜索加入日期的正确路径:

$nodes = $xpath->query( '//div[@class="col-xs-6 col-md-2 text-center"]/div[.="join date"]/preceding-sibling::font' );

我们输出它的节点值:

echo trim( $nodes->item(0)->nodeValue );

结果:

2016 年 2 月 12 日

XPath 是一种使用简短语法对 XML/HTML 文档的各个部分进行寻址以进行复杂搜索的语言。

以上路径表示:

//                                           Following pattern no matter where they are in the document
div[@class="col-xs-6 col-md-2 text-center"]  <div> with class "col-xs-6 col-md-2 text-center"
/div[.="join date"]                          <div> with “join date” as node value
/preceding-sibling::font                     preceding sibling with tag <font>

因此,您必须在 HTML 中搜索最佳唯一模式以隔离所需节点并编写适当的模式以匹配它。


【讨论】:

  • 我收到此错误“注意:尝试在第 21 行的 /www/public_api/store/getItemInfo.php 中获取非对象的属性”
  • 我不知道你的文件第 21 行有什么:请告诉我。顺便说一句,您必须将 HTML 内容传递给-&gt;loadHTML(),而不是文件路径(也许这是问题所在?)在我的回答中,您有很多链接可以查看命令语法、更多示例和教程。
  • 第 21 行是 trim( $created->item(0)->nodeValue 尝试从 $created = $xpath->query( '//div[@class="col- md-6"]/div[.="创建日期"]/preceding-sibling::div');
  • 所以你的路径不匹配:你不必复制粘贴,你需要适应你的文档结构。在您的示例中,即 div[.="Date Created"] 没有前兄弟。在这里查看xpath axes
  • 我并不完全了解每个代表的含义,我认为这将是儿童斧头?
【解决方案2】:

如果您要抓取的数据没有明显的一致格式,那就不容易了。您需要一些聪明才智来查找日期,并且可能在距离日期文本 n 个字符内的文本“加入日期”(因此您可以假设它是相关的,因此您有他们的加入日期)。

制作可靠的工具并不容易。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2017-10-09
    • 2012-03-05
    • 2019-03-01
    • 2021-06-22
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多