使用Nokogiri解析HTML问题

时间:2015-12-15 16:12:13

标签: html ruby nokogiri

我有一些HTML,希望获得<body>元素下的内容。但是,无论我尝试过什么,在使用Nokogiri解析HTML之后,<doctype><head>内的所有内容也会成为<body>元素的一部分,当我检索<body>时我看到<doctype>以及<meta><script>标签内的内容。

我原来的HTML是:

 <!DOCTYPE html \"about:legacy-compat\">
<html>
   <head>
      <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
      <title>Some Title</title>
      <meta name='viewport' id='helloviewport' content='initial-scale=1.0,maximum-scale=2.5' />
      <link rel='stylesheet' id='hello-stylesheet' type='text/css' href='some-4ac294cd125e1a062562aca1c83714ff.css'/>
      <script id='hello-javascript' type='text/javascript' src='/hello/hello.js'></script>
   </head>
   <body marginwidth=\"6\" marginheight=\"6\" leftmargin=\"6\" topmargin=\"6\">
      <div class=\"hello-status\">Hello World</div>
      <div valign=\"top\"></div>
   </body>
</html>

我使用的解决方案是:

parsed_html = Nokogiri::HTML(my_html)
body_tag_content = parsed_html.at('body')
puts body_tag_content.inner_html

我得到了什么:

<p>about:legacy-compat\"&gt;</p>
\n
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
\n
<title>Some title</title>
\n
<meta name='viewport' id='helloviewport' content='initial-scale=1.0,maximum-scale=2.5' />
\n
<link rel='stylesheet' id='hello-stylesheet' type='text/css' href='some-4ac294cd125e1a062562aca1c83714ff.css'/>
\n<script id='hello-javascript' type='text/javascript' src='/hello/hello.js'></script>
<div class=\"hello-status\">Hello World</div>
\n
<div valign=\"top\">\n\n</div>

我期待什么:

<div class=\"hello-status\">Hello World</div>
\n
<div valign=\"top\">\n\n</div>

知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

我通过首先清理原始HTML让你的例子工作。我删除了&#34; about:legacy-compat&#34;从Doctype看起来似乎搞乱了Nokogiri:

# clean up the junk in the doctype
my_html.sub!("\"about:legacy-compat\"", "")

# parse and get the body
parsed_html = Nokogiri::HTML(my_html)
body_tag_content = parsed_html.at('body')

puts body_tag_content.inner_html
# => "\n      <div class=\"hello-status\">Hello World</div>\n      <div valign=\"top\"></div>\n   "

通常,当您解析可能脏的第三方数据(如HTML)时,应首先清理它,以便解析器不会窒息并做出意想不到的事情。你可以通过linter或&#34; tidy&#34;来运行HTML。尝试自动清理它的工具。当所有其他方法都失败时,您必须如上所述手动清洁它。

HTML tidy/cleaning in Ruby 1.9