Python BeautifulSoup 不使用字符串方法查找 span id 名称

1 投票
2 回答
1446 浏览
提问于 2025-04-16 21:57

我想获取我的标签的id名称。

<td vAlign="top" colSpan="2"><IMG height="25" src="images/spacer.gif" width="1"><br>
    <!--start table details-->
    <table cellSpacing="1" cellPadding="5" width="100%" bgColor="#a18c42" border="0" id="compDetails">
        <tr bgColor="white">
            <td class="rowName" noWrap>מספר תאגיד:</td>

            <td width="100%" colSpan="3"><span id="lblCompanyNumber">520000472</span></td>
        </tr>
        <tr bgColor="white">
            <td class="rowName" noWrap>שם תאגיד (עברית):</td>
            <td width="50%"><span id="lblCompanyNameHeb">חברת החשמל לישראל בעמ</span></td>
            <td class="rowName" noWrap>שם תאגיד (אנגלית):</td>
            <td width="50%"><span id="lblCompanyNameEn"></span></td>

        </tr>
        <tr bgColor="white">
            <td class="rowName" noWrap>סטטוס:</td>
            <td width="50%"><span id="lblStatus">פעילה</span></td>
            <td class="rowName" noWrap>סוג תאגיד:</td>
            <td width="50%"><span id="lblCorporationType">חברה ציבורית</span></td>
        </tr>

        <tr bgColor="white">
            <td class="rowName" noWrap>סוג חברה ממשלתית:</td>
            <td width="50%"><span id="lblGovCompanyType">חברה  ממשלתית</span></td>
            <td class="rowName" noWrap>סוג מגבלות:</td>
            <td width="50%"><span id="lblLimitType">מוגבלת</span></td>

假设htmlSpan包含上面的html内容 -

soup = BeautifulSoup(htmlSpan , fromEncoding="windows-1255") # I want to use windows-1255 and not utf8
spans = soup('span', limit=30)

这是输出结果 -

[<span class="mainTitle">╫¿╫⌐╫¥ ╫פ╫ק╫ס╫¿╫ץ╫¬</span>,
 <span class="subTitle">╫ñ╫¿╫ר╫ש
            ╫ק╫ס╫¿╫פ/╫⌐╫ץ╫¬╫ñ╫ץ╫¬</span>,
 <span id="lblCompanyNumber">514568245</span>,
 <span id="lblCompanyNameHeb">╫£╫ס╫ש╫נ ╫נ╫ש╫á╫ר╫ע╫¿╫ª╫ש╫פ ╫ץ╫á╫ש╫¬╫ץ╫ק ╫₧╫ó╫¿╫¢╫
ץ╫¬ ╫ס╫ó"╫₧</span>,
 <span id="lblCompanyNameEn">LAVI INTEGRATION &SYSTEM; ANALYSIS LTD</span>,
 <span id="lblStatus">╫ñ╫ó╫ש╫£╫פ</span>,
 <span id="lblCorporationType">╫ק╫ס╫¿╫פ ╫ñ╫¿╫ר╫ש╫¬</span>,
 <span id="lblGovCompanyType">╫ק╫ס╫¿╫פ ╫£╫נ ╫₧╫₧╫⌐╫£╫¬╫ש╫¬</span>,
 <span id="lblLimitType">╫₧╫ץ╫ע╫ס╫£╫¬</span>,
 <span id="lblStatusMafera"><b><font color="Red"></font></b></span>,
 <span id="lblMaferaDate"></span>,
 <span id="lblStatusMafera1"><b><font color="Red"></font></b></span>,
 <span id="lblCountry">╫ש╫⌐╫¿╫נ╫£</span>,
 <span id="lblCity">╫ק╫ף╫¿╫פ</span>,
 <span id="lblStreet">╫פ╫£╫£ ╫ש╫ñ╫פ</span>,
 <span id="lblStreetNumber">34</span>,
 <span id="lblZipCode">38424</span>,
 <span id="lblPOB"></span>,
 <span id="lblLocatedAt"></span>,
 <span id="lblCompanyGoal">╫£╫ó╫í╫ץ╫º ╫ס╫¢╫£ ╫ó╫ש╫í╫ץ╫º ╫ק╫ץ╫º╫ש</span>,
 <span id="lblCompanyDesc"></span>,
 <span id="lblDochShana"></span>]

我知道怎么获取的内容,但我无法获取的id名称(比如'lblStatus')。

我该如何使用BeautifulSoup的方法来获取它呢?

我还遇到一个问题,就是在不使用BeautifulSoup的情况下保存的内容,结果它会把字符集转换成utf8(或者说是乱码)。最后我需要把的id名称和内容保存到一个csv文件里,但我在这方面遇到了utf8的问题。

谢谢

2 个回答

1

我无法获取的id名称(比如'lblStatus')。

使用spans,这是你自己代码设置的:

for span in spans:
    print span['id']

我也在保存内容时遇到麻烦,因为BeautifulSoup会把它转换成utf8或乱码

我无法复现这个问题:对我来说,spans的输出不是乱码,而是和html中一样的字符。你确定你要解析的页面是用"windows-1255"编码的吗?你的python文件里有正确的UTF-8编码声明(# -*- coding: UTF-8 -*-)吗?

现在在python中,UTF-8几乎是标准,BeautifulSoup内部也使用它。我的建议是,在你的所有代码中都使用UTF-8编码,只有在输出或保存数据时才改变编码(如果你真的需要这样做)。

最后我需要把的id名称和内容保存到csv里...

这是一个粗略的想法,你可以根据自己的需要进行调整:

import csv
file_ = open('output.csv', 'w')
writer = csv.writer(file_)
for span in spans:
    writer.writerow([span['id'], span.string])

...而且我在这方面遇到了utf8的问题。

你能具体说说你遇到的问题是什么吗?在我的系统(GNU/Linux)上,这一切都运行得很好。

1

你可以通过把标签当成字典来访问它的属性,字典的键是标签的名字:

for span in spans:
    print span['id']

这样就能得到你想要的内容:lblCompanyNumber lblCompanyNameHeb lblCompanyNameEn lblStatus lblCorporationType lblGovCompanyType lblLimitType...

我也在尝试把这些内容保存到csv文件里,但不想让BeautifulSoup把它转换成utf8(或者说是乱码)

mac的回答提到使用decode()是对的。这和sys.getdefaultencoding()(默认是'ascii')没有关系,这个不重要。

撰写回答