使用BeautifulSoup拾取以“:”分隔的文本

时间:2014-03-19 07:53:00

标签: python beautifulsoup

网页源代码包含以下细分:

<TR>
<TD width="40%">Company No. <I>(CO.)</I> : <B>056</B></TD>
<TD width="40%">Country Code. <I>(CC.)</I> : <B>3532 </B></TD></TR>
<TR>
<TD>Register <I>(Reg.)</I> : <B>FD522</B></TD>
<TD>Credit<I>(CD.) </I>: <B>YES</B></TD></TR>
<TR>
<TD>Type <I>(TP.)</I> : <B>PRIVATE</B></TD></TR>

CO。,CC等标题的缩写形式。注册。光盘。和TP。是斜体字体。像056,3532,FD522等内容是粗体字。它们以“:”分隔。

我想通过BeautifulSoup分别提取他们的标题和内容,但不成功。

我正在使用:

soup.find_all("td") 

但效果不佳。它返回如&#34;公司编号(CO。) 056 &#34;在一行,但我想分开,如&#34;公司编号&#34;,&#34; CO。&#34;和&#34; 056&#34;。

我也尝试过:

all_texts = soup.find_all(":")

或:

all_texts = soup.find_all("/b") 
等等,他们不工作。

结果

以下帮助有两种方法。在那里参考:

这种方式获取粗体字母的内容,但在某些句子中,最后一个字母丢失了:

for bb in aa:
    cc = bb.get_text()
    dd = cc[cc.find("<b>")+1 : cc.find("</b>")]
    print dd
这样,ee和ff提供了标题&#39;和内容,即&#34;之前和之后的文本:&#34;。

for bb in aa:
    cc = bb.get_text()
    dd = cc.split(' :')
    ee = dd[0] #title
    ff = dd[len(dd)-1] # content

3 个答案:

答案 0 :(得分:1)

使用findAll获取完整HTML文档的正确部分,然后使用:

text = soup.get_text()
print text

然后使用&#39; .split()&#39;

将其分解为数组
for line in soup.get_text().split('\n'):
    if line != ''
        print line.split()

答案 1 :(得分:1)

你不必强迫自己使用beautifulsoup函数来分隔它们 因为里面的每个数据都有不同的令牌密钥要拆分 即:

<TD width="40%">Company No. <I>(CO.)</I> : <B>056</B></TD>
  1. 公司编号由&#34;。&#34;
  2. 分隔
  3. (CO。)由&#34;:&#34;
  4. 分隔 在<B></B>
  5. 056

    我建议您使用substring方法从每个td中获取数据:

    #grab all td
    all_texts = soup.findAll("td") 
    for txt in all_texts
            #convert td into string
            td = str(td)
            txt1 = td[td.find(">")+1 : td.find("<i>")] #get first data from <td>...</i>
            txt2 = td[td.find("<i>")+3 : td.find("</i>")] #get 2nd data from <i>...</i>
            txt3 = td[td.find("<b>")+3 : td.find("</b>")] #get 3rd data from <b>...</b>
            print txt1
            print txt2
            print txt3
    

答案 2 :(得分:1)

这只是简单的字符串操作,而不是整个BS4问题。可以做类似下面的事情。请注意,以下可能不是最好的方法,但我这样做是为了冗长。

from bs4 import BeautifulSoup as bsoup

ofile = open("test.html")
soup = bsoup(ofile)
soup.prettify()

tds = soup.find_all("td")
templist = [td.get_text() for td in tds]

newlist = []
for temp in templist:
    whole = temp.split(":") # Separate by ":" first.
    half = whole[0].split("(") # Split the first half using open parens.
    first = half[0].strip() # First of three elements.
    second = half[1].replace(")","").strip() # Second of three elements.
    third = whole[1].strip() # Use the second element for the first split to get third of three elements.
    newlist.append([first, second, third])

for lst in newlist:
    print lst # Just print it out.

结果:

[u'Company No.', u'CO.', u'056']
[u'Country Code.', u'CC.', u'3532']
[u'Register', u'Reg.', u'FD522']
[u'Credit', u'CD.', u'YES']
[u'Type', u'TP.', u'PRIVATE']
[Finished in 1.1s]

如果有帮助,请告诉我们。