在Python中解析帮助

时间:2015-09-11 11:53:23

标签: python html regex parsing beautifulsoup

有人可以帮我解析一下吗?我遇到了很多麻烦。我正在解析来自site的信息。

以下是几行代码,它们从具有2个标题和4个值的表中提取数据:

for x in soup.findAll(attrs={'valign':'top'}):
                print(x.contents)
                make_list = x.contents
                print(make_list[1]) #trying to select one of the values on the list. 

当我尝试使用make_list[1]行打印时,会出错。但是,如果我拉出最后两行,我会以列表格式获得我想要的html,但我似乎无法将各个行分开或过滤它们(以取出html标记)。有人可以帮忙吗?

以下是输出示例,我想在此处具体说明。我不确定正确的正则表达式:

 ['\n', <td align="left">Western Mutual/Residence <a href="http://interactive.web.insurance.ca.gov/companyprofile/companyprofile?event=companyProfile&amp;doFunction=getCompanyProfile&amp;eid=3303"><small>(Info)</small></a></td>, '\n', <td align="left"><div align="right">           355</div></td>, '\n', <td align="left"><div align="right">250</div></td>, '\n', <td align="left"> </td>, '\n', <td align="left">Western Mutual/Residence <a href="http://interactive.web.insurance.ca.gov/companyprofile/companyprofile?event=companyProfile&amp;doFunction=getCompanyProfile&amp;eid=3303"><small>(Info)</small></a></td>, '\n', <td align="left"><div align="right">           320</div></td>, '\n', <td align="left"><div align="right">500</div></td>, '\n']

1 个答案:

答案 0 :(得分:0)

如果您尝试解析该网站的结果,则以下内容应该有效:

from bs4 import BeautifulSoup

html_doc = ....add your html....
soup = BeautifulSoup(html_doc, 'html.parser')
rows = []
tables = soup.find_all('table')
t2 = None

# Find the second from last table
for t3 in tables:
    t1, t2 = t2, t3

for row in t1.find_all('tr'):
    cols = row.find_all(['td', 'th'])
    cols = [col.text.strip() for col in cols]
    rows.append(cols)

# Collate the two columns
data = [cols[0:3] for cols in rows]
data.extend([cols[4:7] for cols in rows[1:]])

for row in data:
    print "{:40}  {:15} {}".format(row[0], row[1], row[2])

这使我的输出看起来像:

Company Name                              Annual Premium  Deductible
AAA (Interinsurance Exchange) (Info)      N/A             250
Allstate (Info)                           315             250
American Modern (Info)                    N/A             250
Amica Mutual (Info)                       259             250
Bankers Standard (Info)                   N/A             250
California Capital  (Info)                160             250
Century National (Info)                   N/A             250
.....

它是如何运作的?

由于网页主要显示表格,这是我们需要查找的内容,因此第一步是获取表格列表。

该网站已将表格用于多个部分。很有可能页面的结构至少在请求之间保持不变。

我们需要的表几乎是页面上的最后一个(但不是最后一个)所以我决定遍历可用的表并从最后一个选择第二个。 t1 t2 t3只是在迭代时保留最后的值。

从这里开始,HTML表通常具有相当标准的结构TRTD。这个也使用TH作为标题行。使用此table BeautifulSoup然后允许我们枚举所有行。

然后我们可以找到所有列。如果您打印返回的内容,您将看到每行的所有条目,然后您可以查看切片所需的索引。

他们将输出显示在两个列组中,中间有一个空白列。我构建两个列表,提取两组列,然后将第二组附加到第一组的底部以供显示。