繁体   English   中英

如何跨行从html中抓取文本

[英]How to grab text from html across lines

我有一个如下所示的 html 文件。 我想让 Python 做的是,当它看到关键字“存款到现金帐户”时,它会抓取“类=”s14”的“存款到现金帐户”和最接近它的“类=”的 $number(12.32) s14""。与 (5.34) 中的“资产转入”相同。

<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 7pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Deposits to Cash account</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 7pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$12.32</p>
</td>
</tr>
<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 2pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Asset transfers in</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 2pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$5.34</p>
</td>
</tr>

我尝试使用 FOR 循环逐行浏览 html,我使用 Regex 来获取带有“存款到现金帐户”的行,但不知道如何12.32获取12.32

for line in htmlfile:

    if ('Deposits to Cash account' in line):
        lineClass = re.findall(r"<p (.*) style",line)   #grab "class="s14"
        print("inside for loop: ",lineClass)            
    if (lineClass[0] in line) and ('$' in line)
        number = re.findall(r"\$(.*)",line)

print("outside for loop: ",lineClass)

预期结果应该是一个字典:

["Deposits to Cash account": 12.32, 
"Asset transfers":5.34]

错误消息是NameError: name 'lineClass' is not defined

此外,“inside for loop: "Class=s14"" 将被打印,而“outside for loop:” 将被打印,其中丢失了“Class=s14”。 感觉像在 for 循环完成后清除了 lineClass 变量。 这是为什么

如果您不能使用诸如beautifulsoup类的 3rd 方模块,您可以使用 Python 的内置html.parser ( doc ) 制作“穷人” HTML 解析器:

data = '''<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 7pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Deposits to Cash account</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 7pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$12.32</p>
</td>
</tr>
<tr style="height:21pt">
<td style="width:366pt">
<p class="s14" style="padding-top: 2pt;padding-left: 19pt;text-indent: 0pt;text-align: left;">Asset transfers in</p>
</td>
<td style="width:150pt">
<p class="s14" style="padding-top: 2pt;padding-right: 2pt;text-indent: 0pt;text-align: right;">$5.34</p>
</td>
</tr>'''

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    grab_data_fn = lambda data: None
    parsed_data = []

    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        if tag=='p' and 'class' in attrs and 's14' in attrs['class']:
            MyHTMLParser.grab_data_fn = lambda data: MyHTMLParser.parsed_data.append(data.strip())

    def handle_endtag(self, tag):
        MyHTMLParser.grab_data_fn = lambda data: None

    def handle_data(self, data):
        MyHTMLParser.grab_data_fn(data)


parser = MyHTMLParser()
parser.feed(data)
parsed_data = parser.parsed_data

deposits = parsed_data[parsed_data.index('Deposits to Cash account') + 1]
transfers = parsed_data[parsed_data.index('Asset transfers in') + 1]

print('Deposits =',deposits)
print('Transfers =',transfers)

打印:

Deposits = $12.32
Transfers = $5.34

但是,最好使用像beautifulsoupseleniumscrapylxml这样的成熟库。 有了它们,您可以使用丰富的 API(如 XPath、CSS 选择器等)来轻松获取数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM