我每天都会看到问题,询问如何从某些HTML字符串中解析或提取某些内容,第一个答案/注释始终是"不要使用RegEx解析HTML,以免感到愤怒!" (有时省略最后一部分).
这对我来说相当混乱,我一直认为,解析任何复杂字符串的最佳方法是使用正则表达式.那么HTML解析器如何工作呢?它不使用正则表达式来解析.
使用正则表达式的一个特殊参数是,并不总是有一种解析替代方法(例如JavaScript,其中DOMDocument不是普遍可用的选项).例如,jQuery似乎可以使用正则表达式将HTML字符串转换为DOM节点.
不知道是否CW这个,这是一个真正的问题,我想要回答,而不是真正想成为一个讨论主题.
我需要解析(服务器端)大量的HTML页面.
我们都同意regexp不是这里的方式.
在我看来,javascript是解析HTML页面的本地方式,但该假设依赖于具有javascript在浏览器中具有的所有DOM能力的服务器端代码.
Node.js内置了这种能力吗?
有没有更好的方法解决这个问题,解析服务器端的HTML?
标签可以有多个属性.属性在代码中出现的顺序无关紧要.例如:
<a href="#" title="#">
<a title="#" href="#">
Run Code Online (Sandbox Code Playgroud)
如何在Javascript中"规范化"HTML,因此属性的顺序始终相同?我不关心选择哪个顺序,只要它总是相同的.
更新:我最初的目标是更容易区分(在JavaScript中)2个HTML页面,略有不同.由于用户可以使用不同的软件来编辑代码,因此属性的顺序可能会发生变化.这使得差异太冗长.
答案:嗯,首先要感谢所有答案.是的,这是可能的.这就是我成功的方法.这是一个概念证明,它当然可以优化:
function sort_attributes(a, b) {
if( a.name == b.name) {
return 0;
}
return (a.name < b.name) ? -1 : 1;
}
$("#original").find('*').each(function() {
if (this.attributes.length > 1) {
var attributes = this.attributes;
var list = [];
for(var i =0; i < attributes.length; i++) {
list.push(attributes[i]);
}
list.sort(sort_attributes);
for(var i = 0; i < list.length; i++) {
this.removeAttribute(list[i].name, list[i].value);
}
for(var i = 0; i < list.length; i++) { …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的文件:
<table name="content_analyzer" primary-key="id">
<type="global" />
</table>
<table name="content_analyzer2" primary-key="id">
<type="global" />
</table>
<table name="content_analyzer_items" primary-key="id">
<type="global" />
</table>
Run Code Online (Sandbox Code Playgroud)
我需要在后面的引号中提取任何内容name=,即content_analyzer,content_analyzer2和content_analyzer_items.
我在Linux机器上这样做,所以使用sed,perl,grep或bash的解决方案很好.
如何使用各种语言解析HTML并解析库?
回答时:
个人评论将链接到有关如何使用正则表达式解析HTML的问题的答案,作为展示正确行事方式的一种方式.
为了保持一致性,我要求该示例解析hrefin锚标记的HTML文件.为了便于搜索此问题,我要求您遵循此格式
语言:[语言名称]
图书馆:[图书馆名称]
[example code]
Run Code Online (Sandbox Code Playgroud)
请使库成为库文档的链接.如果您想提供除提取链接之外的示例,还请包括:
目的:[解析的作用]
可能重复:
如何使用PHP解析和处理HTML?
建议参考问题.Stack Overflow每天都会有数十个"如何解析HTML"的问题.但是,由于大多数问题都涉及提问者提出的具体情况,因此很难将其复制.这个问题试图建立一个覆盖问题所有方面的通用"参考问题".
这是一个实验.如果这样的参考问题已经存在,请告诉我,我很乐意删除这个.
我理想的愿景是,三个问题中的每个问题都会得到单独回答,每个问题的最佳答案都会达到顶峰.
两周后,我将在三个类别中的每一个类别中获得200个赏金给予最佳答案, 等待关于Meta 的这个问题的讨论.
这些问题中的每一个都已经在其他地方得到了很好的回答,所以复制+粘贴你自己对不同问题的答案对我来说没问题.
如何用PHP解析HTML?
有什么图书馆?哪些使用PHP的本机DOM,哪些有自己的解析引擎?(提示:SimpleHTMLDOM)
1A.我需要找到一个特定的元素,但我发现很难习惯XPath语法.是否有任何基于DOM的库使解析HTML更容易?请考虑制作通用的真实世界示例.
是否有一个PHP库,使我能够使用CSS [2/3]选择器查询DOM,就像jQuery一样?(提示:phpQuery)请考虑制作通用的真实世界示例.
奖金问题:为什么我不应该使用正则表达式?请以非专业人士的名义提供一个非常简短的答案.
据我所知,Python中的两个主要HTML解析库是lxml和BeautifulSoup.我选择了BeautifulSoup作为我正在研究的项目,但除了找到更容易学习和理解的语法之外,我选择了它.但是我看到很多人似乎都喜欢lxml而且我听说lxml更快.
所以我想知道一个优于另一个的优点是什么?我什么时候想使用lxml?什么时候最好使用BeautifulSoup?还有其他值得考虑的图书馆吗?
我试图抓住几个单词的大写字母并将它们包裹在span标签中.我使用preg_replace进行提取和包装,但它没有输出任何东西.
preg_replace("/[A-Z]/", "<span class=\"initial\">$1</span>", $str)
Run Code Online (Sandbox Code Playgroud) 我想使用HTML敏捷包来解析复杂网页中的表,但我在对象模型中丢失了.
我查看了链接示例,但没有找到任何表数据.我可以使用XPath来获取表吗?在加载了关于如何获取表格的数据后,我基本上已经丢失了.我之前在Perl中做过这个,它有点笨拙,但很有效.(HTML::TableParser).
如果能够解释正确的解析对象顺序,我也很高兴.
使用Haskell抓取网站的库的当前状态是什么?
我正努力让自己在Haskell中完成更多快速的一次性任务,以帮助提高我对语言的舒适度.
在Python中,我倾向于使用优秀的PyQuery库.在Haskell中有类似简单易用的东西吗?我看过Tag Soup,虽然解析器本身看起来不错,但实际遍历页面并不像其他语言那样好看.
那里有更好的选择吗?
html-parsing ×10
html ×5
regex ×4
php ×2
c# ×1
haskell ×1
javascript ×1
jquery ×1
lxml ×1
node.js ×1
parsing ×1
perl ×1
preg-replace ×1
python ×1
sed ×1
server-side ×1
web-scraping ×1