如何抓取 HTML 标签的内容?

Posted

技术标签:

【中文标题】如何抓取 HTML 标签的内容?【英文标题】:How to grab the contents of HTML tags? 【发布时间】:2010-09-07 12:15:32 【问题描述】:

嘿,所以我想做的是抓住第一段的内容。字符串$blog_post 包含很多段落,格式如下:

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>

我遇到的问题是我正在编写一个正则表达式来获取第一个 &lt;p&gt; 标记和第一个关闭 &lt;/p&gt; 标记之间的所有内容。但是,它抓住了第一个 &lt;p&gt; 标记和 last 关闭 &lt;/p&gt; 标记,这导致我抓住了所有东西。

这是我当前的代码:

if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph))
   echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>";
else
  echo $blog_post;

【问题讨论】:

【参考方案1】:

好吧,假设段落中没有其他 html,sysrqb 会让您匹配第一段中的任何内容。你可能想要更多这样的东西

<p>.*?</p>

? 放在* 之后使其不是贪婪的,这意味着它只会在匹配&lt;/p&gt; 之前匹配尽可能少的文本。

【讨论】:

【参考方案2】:

如果您使用 preg_match,请使用 "U" 标志使其不贪婪。

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);

$matches[1] 将包含第一段。

【讨论】:

【参考方案3】:

使用strpos() 查找第一个位置可能会更容易和更快

 <p>

首先

</p>

然后使用substr() 提取段落。

 $paragraph_start = strpos($blog_post, '<p>');
 $paragraph_end = strpos($blog_post, '</p>', $paragraph_start);
 $paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>'));

编辑:实际上其他人的答案中的正则表达式会更容易和更快......你在问题中的大复杂正则表达式让我感到困惑......

【讨论】:

【参考方案4】:

使用正则表达式进行 html 解析永远不是正确的解决方案。对于这种特殊情况,您应该使用 XPATH:

$string = <<<XML
<a>
 <b>
  <c>texto</c>
  <c>cosas</c>
 </b>
 <d>
  <c>código</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* Busca <a><b><c> */
$resultado = $xml->xpath('//p[1]');

【讨论】:

以上是关于如何抓取 HTML 标签的内容?的主要内容,如果未能解决你的问题,请参考以下文章

抓取一个html标签,只留下内容

如何在每两个兄弟 <hr> 标签之间抓取内容?

如何使用 R 在 html 中的注释标签内抓取表格?

Python+Selenium+PhantomJs爬虫 怎么抓取弹出新标签页的内容

java爬虫抓取指定数据

beautifulsoup 怎样抓取 select 标签里面的 option 的文本