网页源代码包含以下细分:
<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
答案 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>
<B></B>
内我建议您使用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]
如果有帮助,请告诉我们。