通过CommandLin替换HTML的选择

2024-04-25 00:39:17 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:我知道怎么做。我不是在寻找解决方案,而是在花时间自己用脚本语言写东西之前,先寻找一个流程或现有的程序建议。你知道吗

我在不同的目录中有一些HTML文件,它们都具有相似的结构:

<html>
    <head>...</head>
    <body>
        <nav>...</nav>
        <section>...</section>
    </body>
</html>

对于我指定的所有文件,我想用其他节以编程方式替换HTML节(例如,用不同的nav块[在我选择的文件中指定])替换<nav>块)

我认为理想的解决方案是使用lxml或类似的Python工具,但是如果有一种简单的方法可以使用*nixy工具或现有的程序来实现,我很乐意这样做,而不是编写一个脚本。你知道吗


Tags: 文件工具程序编辑html时间sectionbody
3条回答

最后,我编写了自己的小命令行工具来做我想做的事情。它在我的用例中运行得相当好,我打算随着时间的推移对它进行改进。它在GitHub上:trufflepig。你知道吗

我希望它也能对其他人有用。你知道吗

您也许可以像这样对Python使用BeautifulSoup。你知道吗

import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(htmldata)
nav = soup.find("nav")
nav.name = "new name"

例如:

import BeautifulSoup

html_data = "<nav>Some text</nav>"
soup = BeautifulSoup.BeautifulSoup(html_data)
nav = soup.find("nav")
nav.name = "nav2"

将更改:<nav></nav><nav2></nav2>

不要使用正则表达式或字符串解析。那些只会让你的头受伤。使用解析器。你知道吗

在Ruby中,我会使用Nokogiri:

require 'nokogiri'

html = '
<html>
  <body>
    <nav>...</nav>
    <section>...</section>
  </body>
</html>
'
doc = Nokogiri::HTML(html)

nav = doc.at('nav').content = "this is a new block"
puts doc.to_html

输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
    <nav>this is a new block</nav><section>...</section>
</body></html>

当然,您希望用File.read('snippet.html')之类的内容替换"this is a new block"。你知道吗

如果替换文件包含HTML片段而不是nav内容,请使用以下内容:

nav = doc.at('nav').replace('<nav>this is a new block</nav>')

输出将是相同的。(同样,如果你是这样学习的,可以使用File.read从文件中获取它。)

在Nokogiri中,at找到由CSS或XPath访问器指定的标记的第一个实例并返回节点。我在上面使用了CSS,但是//nav也可以。at猜测访问器的类型。如果您想具体一点,可以使用at_cssat_xpath,因为可能有不明确的访问器。另外,Nokogiri有search,它返回一个NodeSet,它的行为类似于一个数组。您可以按自己的意愿对结果进行迭代。与at一样,也有CSS和XPath特定的版本,分别是cssxpath。你知道吗

Nokogiri有一个CLI接口,对于像本例这样简单的东西,它可以工作,但我也可以用sed或Ruby/Perl/Python一行程序来完成。你知道吗

curl -s http://nokogiri.org | nokogiri -e'p $_.css("h1").length'

不过,HTML很少这么简单,尤其是在野外漫游的任何东西,CLI或一行程序解决方案将迅速失控,或者干脆消亡。我说,基于多年来编写的许多spider和RSS聚合器,当您引入额外的HTML或XML源代码时,一开始简单的东西会变得复杂得多,而且从来不会变得简单。使用解析器让我学会了先去找它们。你知道吗

相关问题 更多 >