Python beauthulsoup解析特定tex

2024-10-02 22:31:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解析一个html文件,我想找到文件中写着“小报告公司”的部分,旁边有一个“X”或复选框,或者没有。复选框通常是用Wingdings字体或ascii代码完成的。在下面的HTML中,您将看到它旁边的wingdings中有一个þ。在

我可以显示正则表达式搜索文本的结果,但在下一步中查找复选框时遇到了问题。在

我将使用它来解析许多不同的html文件,这些文件的格式不完全相同,但大多数文件都将使用类似于本例的表格和ascii文本。在

以下是HTML代码:

<HTML>
<HEAD><TITLE></TITLE></HEAD>
<BODY>
<DIV align="left">Indicate by check mark whether the registrant is a large accelerated filer, an accelerated filer, a non-accelerated filer, or a smaller reporting company. See the definitions of &#147;large accelerated filer,&#148; &#147;accelerated filer&#148; and &#147;smaller reporting company&#148;. (Check one):
</DIV>

<DIV align="center">
<TABLE style="font-size: 10pt" cellspacing="0" border="0" cellpadding="0" width="100%">
<!-- Begin Table Head -->
<TR valign="bottom">
    <TD width="22%">&nbsp;</TD>
    <TD width="3%">&nbsp;</TD>
    <TD width="22%">&nbsp;</TD>
    <TD width="3%">&nbsp;</TD>
    <TD width="22%">&nbsp;</TD>
    <TD width="3%">&nbsp;</TD>
    <TD width="22%">&nbsp;</TD>
</TR>
<TR></TR>
<!-- End Table Head -->
<!-- Begin Table Body -->
<TR valign="bottom">
    <TD align="center" valign="top"><FONT style="white-space: nowrap"> Large accelerated filer <FONT style="font-family: Wingdings">&#111;</FONT></FONT>
    </TD>
    <TD>&nbsp;</TD>
    <TD align="center" valign="top"><FONT style="white-space: nowrap">Accelerated filer <FONT style="font-family: Wingdings">&#111;</FONT></FONT>
    </TD>
    <TD>&nbsp;</TD>
    <TD align="center" valign="top"><FONT style="white-space: nowrap"> Non-accelerated filer <FONT style="font-family: Wingdings">&#111;</FONT> </FONT>
    <FONT style="white-space: nowrap">(Do not check if a smaller reporting company)</FONT>
    </TD>
    <TD>&nbsp;</TD>
    <TD align="center" valign="top"><FONT style="white-space: nowrap"> Smaller reporting company <FONT style="font-family: Wingdings">&#254;</FONT></FONT></TD>
</TR>
<!-- End Table Body -->
</TABLE>
</DIV></BODY></HTML>

下面是我的Python代码:

^{pr2}$

问题: 我如何设置此项以进行依赖于第一次搜索的第二次搜索?所以当我找到“小报告公司”时,我可以搜索接下来的几行,看看是否有ascii码?我一直在看汤医生。我试着做find and findNext,但没能让它发挥作用。在


Tags: 文件stylewidthtrtdcenterwhitefont
3条回答

如果知道wingding字符的位置不会改变,可以使用.next。在

>>> nodes = soup.findAll(text=re.compile('[sS]maller.*[rR]eporting.*[cC]ompany'))
>>> nodes[-1].next.next  # last item in list is the only good one... kinda crap
u'&#254;'

或者你可以上去,然后find从那里:

^{pr2}$

或者你也可以反过来:

>>> soup.findAll(text='&#254;')[0].previous.previous
u' Smaller reporting company '

假设你知道你要找的翅膀特征。在

最后一个策略还有一个额外的好处,就是过滤掉正则表达式捕捉到的其他垃圾,我想你并不真的想要;然后你可以循环查看结果,知道你只在正确的列表中工作,这样你就可以随心所欲地阅读if。在

您可以尝试遍历结构并检查内部标记内的值或检查外部标记中的值。我已经记不清该怎么做了,最后我使用了lxml来实现这一点,但我认为bsoup可以做到这一点。在

如果你不能让bsoup来做,那就看看lxml。它可能更快取决于你在做什么。它还有一些钩子,可以在lxml中使用bsoup。在

lxml有一个容忍的HTML解析器。您不需要bsoup(它现在已经被作者弃用),并且应该避免使用regex来解析HTML。在

以下是您要寻找的第一个粗略的概述:

guff = """\
<HTML>
<HEAD><TITLE></TITLE></HEAD>
[snip]
</DIV></BODY></HTML>
"""
from lxml.html import fromstring
doc = fromstring(guff)
for td_el in doc.iter('td'):
    font_els = list(td_el.iter('font'))
    if not font_els: continue
    print
    for el in font_els:
        print (el.text, el.attrib)

这会产生:

^{pr2}$

相关问题 更多 >