我有一个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很陌生。
答案 0 :(得分:5)
原则上你需要使用一个真正的解析器(Beaut.Soup是),正则表达式不能处理嵌套元素,因为计算机科学原因(有限状态机无法解析无上下文语法,IIRC)
答案 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))
答案 2 :(得分:2)
如果HTML格式正确,您可以将其解析为DOM树并使用XPath提取所需的表。我通常使用lxml来解析XML,it can parse HTML as well。
用于取出第一个表的XPath将是“// table [1]”。