我有一个外部 HTML 源,我想抓取它并转换为本地 XML 文件或添加到 MySQL DB。
外部源大多是规范化的和(有点)语义的,所以我需要做的就是使用XPATH
来获取所有td
内容或所有li
内容等。问题是这些项目有时会使用<strong>
or <b>
or<i>
标记来设置我需要的元素的样式。
这在技术上是语义化的,因为重点是要强调特定文本,并且开发人员可能希望使用不是浏览器默认的 CSS。
问题是我试图抓取的实际内容被认为是这个内联元素的子元素,因此 PHP 扩展喜欢simplexml
orDOMDocument
并将DOMNode
它们视为这样。例如:
<table>
<tr><td>Thing 1</td><td>Thing 2</td></tr>
<tr><td>Thing 3</td><td>Thing 4</td></tr>
<tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr>
</table>
将导致:
[table] =>
[tr] =>
[td] => Thing 1
[td] => Thing 2
[tr] =>
[td] => Thing 3
[td] => Thing 4
[tr] =>
[td] =>
[strong] => Thing 5
[td] =>
[strong] => Thing 6
显然上面的内容并不是simplexml返回的内容,但上面反映了普遍的问题。
那么有没有一种方法,使用已经内置在 DOMDocument 中的参数或使用更复杂的 XPath 查询来获取td
元素的内容,其中任何子项(如果有的话)被剥离其后代状态并将所有内容视为文本查询的元素?
现在,我唯一的解决方案是:
a) 有一个foreach
检查每个结果的循环,例如:
$result_text = ($result -> strong) ? $result - strong : $result;
b)<strong>
在将 HTML 字符串导入任何预构建类(如 simplexml 或 DOMDocument)之前,使用正则表达式从 HTML 字符串中去除任何标签。