Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP在任意HTML中查找重要文本?_Php_Regex_Dom_Text Parsing - Fatal编程技术网

使用PHP在任意HTML中查找重要文本?

使用PHP在任意HTML中查找重要文本?,php,regex,dom,text-parsing,Php,Regex,Dom,Text Parsing,我有一些随机的HTML布局,其中包含我想提取的重要文本。我不能只strip_tags(),因为那样会在侧边栏/页脚/页眉等处留下一堆多余的垃圾 我发现了一个,我想知道在PHP中是否有类似的东西 这个概念相当简单:使用 关于文本密度的信息 vs.HTML代码来计算一行 文本值得输出。(这不是 一个新颖的想法,但它是有效的!)基本的 过程如下: 解析HTML代码并跟踪处理的字节数 按每行或每段存储文本输出 将所需的HTML字节数与每个文本行关联 描述一下 通过计算文本的比率来计算每行的文本密度 t>

我有一些随机的HTML布局,其中包含我想提取的重要文本。我不能只
strip_tags()
,因为那样会在侧边栏/页脚/页眉等处留下一堆多余的垃圾

我发现了一个,我想知道在PHP中是否有类似的东西

这个概念相当简单:使用 关于文本密度的信息 vs.HTML代码来计算一行 文本值得输出。(这不是 一个新颖的想法,但它是有效的!)基本的 过程如下:

  • 解析HTML代码并跟踪处理的字节数
  • 按每行或每段存储文本输出
  • 将所需的HTML字节数与每个文本行关联 描述一下
  • 通过计算文本的比率来计算每行的文本密度 t> o字节
  • 然后使用神经网络确定该行是否为内容的一部分
  • 你可以得到相当好的结果只是 通过检查线的密度是否为 高于固定阈值(或 平均),但系统制造的成本较低 如果你使用机器学习就会犯错误- 更不用说更容易 实施


    更新:我开始悬赏一个可以从随机HTML模板中提取主要内容的答案。由于我无法共享我将要使用的文档,所以只需选择任意博客站点,并尝试从布局中提取正文。请记住,页眉、侧边栏和页脚也可能包含文本。有关想法,请参见上面的链接。

    我不久前曾参与过一个类似的项目。它没有Python脚本那么复杂,但它会做得很好。查看简单的HTML PHP解析器

    可以用来解析html文档,然后可以通过PHP查询这些文档


    编辑:wikied

    取决于您的HTML结构,如果您有id或类,您可能会变得有点复杂,并使用preg_match()专门获取特定开始和结束标记之间的任何信息。这意味着您应该知道如何编写正则表达式

    您还可以查看浏览器仿真PHP类。我已经为页面抓取做了这项工作,它工作得很好,这取决于DOM的格式。我个人喜欢SimpleBrowser

    • 是一个基于jQuery JavaScript库的服务器端、可链接、CSS3选择器驱动的文档对象模型(DOM)API

    更新2

    • 演示:
    • 在取自和的休闲博客列表上进行测试
  • 许多博客利用了
  • 博客的html结构几乎每次都是一样的
  • 避免使用常见的选择器,如
    #侧栏、#页眉、#页脚、#注释等
  • 通过标记名
    script,iframe
  • 清除众所周知的内容,如:
  • /\d+\scomment(?[s])/im
  • /(阅读其余部分|阅读更多内容)。*/im
  • /(?:.*?:由提交人提交?:ed)?.*\s(上午十点到下午六点))/im
  • /[^a-z0-9]+/im

  • 搜索熟悉的类和ID:

    • typepad.com
      。输入内容
    • org
      .post entry.entry.post
    • movabletype.com
      .post
    • blogger.com
      .post body.entry content
    • drupal.com
      .content
    • tumblr.com
      .post
    • squarespace.com
      。日记账分录文本
    • expressionengine.com
      .entry
    • gawker.com
      .post body

    • Ref:



    基于常见html结构进行搜索,如下所示:

    <div>
    <h1|h2|h3|h4|a />
    <p|div />
    </div>
    
    我开发了一个可以用于此目的的软件包

    它由一组类组成,这些类可以链接在一起,以在HTML/XML代码中执行一系列解析、过滤和转换操作

    它的目的是处理现实世界的页面,因此它可以处理格式错误的标记和数据结构,因此它可以尽可能多地保留原始文档

    它附带的一个过滤器类可以进行DTD验证。另一个可以丢弃不安全的HTML标记和CSS以防止XSS攻击。另一个可以简单地提取所有文档链接

    所有这些过滤器类都是可选的。如果你需要的话,你可以用你想要的方式把它们连在一起

    所以,为了解决您的问题,我不认为在PHP anywhere中已经有一个特定的解决方案,但是可以为它开发一个特殊的过滤器类。看看这个包裹。它被彻底地记录下来


    如果您需要帮助,只需查看我的个人资料并发送邮件给我,我甚至可以开发出满足您需要的过滤器,最终在其他语言的任何解决方案中得到启发

    “提取”是什么意思?用完整完整的HTML(如
    )提取,还是只提取文本?我不会重新实现这个。要么直接使用python模块
    $text=exec(“python-m…”)
    ,要么使用一个在线服务@Pekka,我宁愿将标记元素(如代码块或对象嵌入)与文本一起使用,但也可以只使用纯文本@马里奥-谢谢!这看起来是一个很好的开始——但我确实需要一些可以在本地运行的东西,如果可能的话,我宁愿不在我的服务器应用程序中添加Java(相关)来处理标记。对于密度和内容,您必须找到一些额外的工具。您可能正在寻找类似可读性算法的东西,请参阅此问题以了解更多信息和实现:这只是一个普通的DOM解析器,需要您了解布局才能找到所需的内容。这些是我正在处理的任意HTML文件,因此它们的结构通常非常不同。@Xeon不一定:您可以遍历每个元素并检查其
    textNode
    值(或任何元素的名称)
    <div>
    <h1|h2|h3|h4|a />
    <p|div />
    </div>
    
    $doc = phpQuery::newDocumentFile('http://blog.com')->find('h1,h2,h3,h4')->parent()->children('p,div');