用于python的CSS感知智能html解析器

时间:2012-07-25 10:19:39

标签: python html html-parsing screen-scraping

我正在寻找一种能够识别css并且与浏览器呈现html相同的HTML解析器。我实际上在寻找等效的element.innerText(DOM-JS)。 让我举个例子。考虑以下html,

<style>
.AAA { display:inline;}
.BBB { display:none;}
.CCC { display:inline ;}
</style>
<span id="sarim">

    <span class="AAA">a</span>
    <span style="display:none">b</span>
    c
    <span class="CCC">d</span>
    <div style="display:inline">e</div>
    <span class="BBB">f</span>

</span>

现在,如果我在浏览器中运行上述html并运行document.getElementById('sarim').innerText则返回“a c d e”。这正是我需要的。但是,如果我使用html解析器并剥离html标签,它将返回“abcdef”。我需要一个解析器,它会自动忽略“b”和“f”读取它们的css属性。

知道哪个解析器支持这个吗?我尝试过美丽的肥皂,

hiddenelements = sarim.findAll(True, {'style' : 'display:none'})
for p in hiddenelements:
    p.extract()

现在sarim.text返回文本,但这仅适用于内联样式,这是基于css类的样式失败的手动过程,并且因为类将是随机的,我正在寻找一个智能解析器将自动执行此操作。

我有一个故障安全的想法来运行无头wekbit(phantomjs.org)并使用element.innerText来检索可见文本,还有更好的主意吗?

2 个答案:

答案 0 :(得分:1)

如何Python-Webkit这是webkit的Python绑定。

  

Python Webkit DOM项目使得python成为javascript的完全对等   它涉及访问和操作可用的完整功能   Webkit,例如HTML5。一切可以用javascript完成,   例如getElementsbyTagName和appendChild,事件回调通过   onclick,通过window.setTimeout超时回调,甚至是AJAX   使用XMLHttpRequest,也可以从python中完成。

答案 1 :(得分:0)

我在https://github.com/JamieMason/Asterisk使用PhantomJS创建了一个支持CSS的HTML缩小器 - 为了您的目的,可以很容易地对它进行分叉和修改。

主要工作是使用https://github.com/JamieMason/Asterisk/blob/master/src/browser.js完成的,对于我的用例,我检查样式以生成HTML输出 - 但你可以改为返回innerText。