我有一张桌子需要解析,特别是这是一个有4个时间段的学校时间表,每周5个时段.我试图解析它,但老实说还没有走得太远因为我对如何处理rowspan和colspan属性感到困惑,因为它们本质上意味着我需要继续缺少数据.
作为我想要做的一个例子,这是一个表:
<tr>
<td colspan="2" rowspan="4">#1</td>
<td rowspan="4">#2</td>
<td rowspan="2">#3</td>
<td rowspan="2">#4</td>
</tr>
<tr>
</tr>
<tr>
<td rowspan="2">#5</td>
<td rowspan="2">#6</td>
</tr>
<tr>
</tr>
Run Code Online (Sandbox Code Playgroud)
我想把那个表转换成这个列表:
[[1,1,2,3,4],
[1,1,2,3,4],
[1,1,2,5,6],
[1,1,2,5,6]]
Run Code Online (Sandbox Code Playgroud)
现在我得到一个平面列表,类似于:
[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
但是在字典形式中,有关于它跨越多少列和行的信息,它的描述以及它的周.
显然,这需要适用于rowspan/colspan的所有可能性,并且需要在同一个表中使用多周.
html并不像我描述的那样干净,我遗漏了许多属性,文本显然不像1,2,3,4那样简洁,而是描述性文本块.但是,如果我能够解决这个问题,那么它应该很容易融入我已经写过的内容中.
我一直在使用lxml.html和Python来做这件事,但如果它提供了更简单的解决方案,我愿意使用其他模块.
我希望有人可以帮助我,因为我真的不知道该怎么做.
编辑:
<table>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td rowspan="4">Thing</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table> …Run Code Online (Sandbox Code Playgroud) 所以我正在研究一种语言,我想,主要是出于好奇,看看我是否能够可视化文件的抽象语法树.经过一番环顾,我发现了graphviz dot,转换了我的AST prettyprinter,可以输出到这种格式:
digraph G {
main -> parse -> execute;
main -> init;
main -> cleanup;
execute -> make_string;
execute -> printf
init -> make_string;
main -> printf;
execute -> compare;
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是,当我跑
dot -Tpng dotf.gv -o graph.png
Run Code Online (Sandbox Code Playgroud)
在输入文件中,我最终得到一个宽度为8000像素的文件,这是不切实际的.看到这里.
我不知道是否可以修复,但如果有人可以感激我.
我正在尝试创建一个Flask Web应用程序,您必须要求整个非本地网站,我想知道是否可以将其缓存以加快速度,因为网站不会经常更改但我仍然希望它每天更新缓存一次.
无论如何,我查了一下,找到了Flask-Cache,它似乎做了我想要的,所以我对它进行了适当的修改,并提出了添加:
from flask.ext.cache import Cache
[...]
cache = Cache()
[...]
cache.init_app(app)
[...]
@cache.cached(timeout=86400, key_prefix='content')
def get_content():
return lxml.html.fromstring(urllib2.urlopen('http://WEBSITE.com').read())
Run Code Online (Sandbox Code Playgroud)
然后我从需要内容的函数中调用,如下所示:
content = get_content()
Run Code Online (Sandbox Code Playgroud)
现在我希望每次调用时都重用缓存的lxml.html对象,但这不是我所看到的.每次进行呼叫时对象的ID都会改变,并且根本没有加速.那么我误解了Flask-Cache的功能,或者我在这里做错了什么?我尝试过使用memoize装饰器,我已经尝试过减少超时或者将它们全部一起删除,但似乎没有任何改变.
谢谢.