python lxml.html:在html docstring中拉出前面的文本

时间:2015-10-12 16:55:46

标签: python parsing lxml lxml.html

我尝试根据html文档中前面的文字识别给定的<table>元素。

我目前的方法是对每个html表元素进行字符串化并在文件文本中搜索其文本索引:

filing_text=request.urlopen(url).read()

#some text cleanup here to make lxml's output match the .read() content
ref_text = lxml.html.tostring(filing_text).upper().\
              replace(b"&#160;",b"&NBSP;")
    tbl_count=0
    for tbl in self.filing_tree.iterfind('.//table'):
        text_ind=reftext.find(lxml.html.tostring(tbl).\
                              upper().replace(b"&#160;",b"&NBSP;"))
        start_text=lxml.html.tostring(tbl)[0:50]
        tbl_count+=1
        print ('tbl: %s; position: %s; %s'%(tbl_count,text_ind,start_text))

鉴于table元素的起始索引,我可以搜索前面的x个字符,这些字符可以识别帮助以识别表格的内容。

这种方法存在两个问题:

  1. 由于标签密度(即,归档文本的多少是标记与内容)从url到url是不同的,因此在前面的文本中难以标准化我的搜索范围。 2500个字符的html可能包含300个字符的实际内容或2000
  2. 每个表元素的序列化和搜索似乎效率很低。它为网络编写工作流程增加了比我喜欢
  3. 更多的开销

    问题:有更好的方法吗?是否有一种lxml方法可以在给定元素之前提取文本内容?我想象一下像itertext()那样从元素向后移动,递归地通过html文档字符串。

1 个答案:

答案 0 :(得分:1)

使用美丽的汤。只是一个让你开始的嗤之以鼻:

>>> from bs4 import BeautifulSoup
>>> stupid_html = "<html><p> Hello </p><table> </table></html>"
>>> soup = BeautifulSoup(stupid_html )
>>> list_of_tables = soup.find_all("table")
>>> print( list_of_tables[0].previous )
 Hello