2016-12-06 24 views
1

我有外部HTML网站,我需要从该网站的表中提取数据。然而,HTML网页的来源有误格式化,除了在码表,所以我不能使用提取部分代码并在bash中解析HTML

xmllint --html --xpath <xpath> <file> 

,因为它不能正常工作,当HTML格式的网站上被打破了。

我的想法是使用curl和删除表格上方和下方的代码。当提取表时,代码是干净的,它适合于xmllint工具(我可以使用xpath)。然而,删除上面的所有内容对于shell来说都具有挑战性,你可以在这里看到:Sed doesn't backtrack: once it's processed a line, it's done. 有没有一种方法如何仅从bash中的HTML网站中提取表的代码? Suposse,代码具有这种结构。

<html> 
<head> 
</head> 
<body> 
<p>Lorem ipsum ....</p> 
    <table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
<p>... dolor.</p> 
</body> 
</html> 

我需要这样的输出正确地解析数据:

<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 

请不要给我减的,因为试图使用bash。

+0

您可以检查此文章: http://www.joyofdata.de/blog/using-linux-shell-web-scraping/ – Hackerman

+0

您是否尝试过使用HTML-Tidy清理HTML http://www.html-tidy.org/ –

+0

我试过“ tidy -ashtml page.html -output page2.html“但不幸的是,它返回”在使用HTML Tidy生成整理版本之前,必须修复此文档的错误。“它需要完全自动化。不管怎样,谢谢。@ Dan-Dev –

回答

3

我会打破我尝试使用xmllint它支持--html标志通过解析它低于该分析html文件

首先你可以检查你的HTML文件的理智的回答确认,如果该文件是为按照标准,或者看到抛出的错误: -

$ xmllint --html YourHTML.html 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head> 
</head> 
<body> 
<p>Lorem ipsum ....</p> 
    <table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
<p>... dolor.</p> 
</body> 
</html> 

我原来的YourHTML.html文件只是被你的问题输入HTML文件。

现在的值提取部分: -

启动文件从根节点解析到的table节点(//html/body/table)和HTML解析器&交互shell模式(xmllint --html --shell

运行运行xmllint该命令明显产生结果,

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html 
/> ------- 
<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
/> 

现在使用sed删除特殊字符即sed '/^\/ >/d'生产

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' 
<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 

这是您所期望的输出结构。测试在xmllint: using libxml version 20900

我往前走了一步,如果你想获取table标签内的值,你可以将sed命令以将这些提取物作为

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | xargs 
Company Contact 
+0

当HTML有效并且没有被破坏时,此代码完美工作。但我不能在我的情况下适用这个(对于简化的误导性示例抱歉)。显然,很多网页没有有效的html代码,所以它不允许我从它们解析数据。假设只有有效的代码在表格内。不幸的是,我必须承认,bash并不真正适合于提取不遵循W3C标准的网页上的部分代码。你知道任何选项如何提取不同的表? –

+0

我发现毕竟,这个解决方案完全符合@ Dan-Dev的建议,可以通过选项force-output来使用整齐:yes –