如何提取HTML中的嵌套表格?
我有一个HTML文件(编码为utf-8)。我用codecs.open()
打开它。文件的结构是:
<html>
// header
<body>
// some text
<table>
// some rows with cells here
// some cells contains tables
</table>
// maybe some text here
<table>
// a form and other stuff
</table>
// probably some more text
</body></html>
我只需要提取第一个表格(忽略带表单的那个)。在第一个<table>
之前和对应的</table>
之后的所有内容都要省略。有些单元格里还包含段落、加粗的文字和脚本。每一行的主表格里最多只能有一个嵌套表格。
我该如何提取这些内容,以便得到一个行的列表,每个元素包含单元格的数据(普通的unicode字符串),以及每个嵌套表格的行列表?嵌套的层级最多只有1层。
我试过HTMLParse、PyParse和re模块,但都没能成功。我对Python还比较陌生。
3 个回答
2
如果你的HTML代码格式正确,你可以把它解析成一个DOM树,然后用XPath来提取你想要的表格。我通常使用lxml来解析XML,而它也可以解析HTML。
要提取第一个表格,可以使用的XPath是"//table[1]"。
4
你可能会喜欢 lxml。我不太确定你想用那个结构做什么,但也许这个例子能帮到你...
import lxml.html
def process_row(row):
for cell in row.xpath('./td'):
inner_tables = cell.xpath('./table')
if len(inner_tables) < 1:
yield cell.text_content()
else:
yield [process_table(t) for t in inner_tables]
def process_table(table):
return [process_row(row) for row in table.xpath('./tr')]
html = lxml.html.parse('test.html')
first_table = html.xpath('//body/table[1]')[0]
data = process_table(first_table))
5
试试 Beautiful Soup 这个工具吧。
简单来说,你需要用一个真正的解析器(而Beautiful Soup就是这样一个工具)。正则表达式处理不了嵌套的元素,这是因为一些计算机科学的原因(如果我没记错的话,有限状态机无法解析上下文无关的语法)。