Beautifulsoup通过糟糕的标签解析

时间:2011-12-15 19:37:20

标签: python beautifulsoup

我的理解是正则表达式是穷人处理beautifulsoup的方法,但我想知道如果在我试图解析的html中没有明确定义的标签,这是否是我唯一的选择?

我最终只是试图从html中获取一些简单的数据......但它只是在一系列表中看起来像这样:

<table width="733" border="0" cellpadding="2">
<tr>
<td align="right" valign="top" nowrap="nowrap" bgcolor="#29ff36">
<font size="-1" face="Verdana, Arial, Helvetica, sans-serif">
<strong>
PART CODE:
</strong>
</font>
</td>
<td align="left" valign="top" nowrap="nowrap">
<font size="-1" color="#7b1010" face="Verdana, Arial, Helvetica, sans-serif">
PART#  (//THIS IS WHAT I WANT)
</font>
</td>
<td>
</td>

如果没有正则表达式,有没有一种方法可以解决这个问题?

感谢帮助人员。这个网站令人难以置信

行:

这些表中大约有15个,每个表都有一个标签(例如Cost,Vendor,On-Hand),它位于第一个单元格中,然后我实际想要的数据总是在下一个单元格中。

label = 'Price:'
rows = soup.findAll('tr')
for tr in rows:
  cols = tr.findAll('td')
  for td in cols:
    if td.find(text=True) == label:
      print td.find(text=True)

这足以找到带有标签的正确单元格......我现在基本上只需要找到下一个单元格。根据beautifulsoup文档的“下一步”命令并没有真正实现这一点。 有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您也可以使用lxml代替beautifulsoup执行此操作。由于lxml.html方法,我切换到使用cssselect()而不是beautifulsoup。它需要css规则,就像你在css文件或jQuery中使用一样。

from lxml.html import fromstring

raw_html_data = """ ... your html data here ... """

doc = fromstring(raw_html_data)
part_number = doc.cssselect('td[align=left] font')[0].text
# part_number.strip() # optionally strip leading and trailing whitespace

您可以使用pip安装lxml

$ pip install lxml

银盘解决方案:

# ... starting with doc from above
info = []
target_trs = doc.cssselect('table tr')  # tweak based on actual html
for tr in trs:
    target_cells = tr.cssselect('td font')
    label = target_cells[0].text.strip()
    data = target_cells[1].text.strip()
    info.append((label,data))
# now you have an array of (label,data) pairs in info

答案 1 :(得分:0)

您提供的示例并不完全清楚,但这是一个片段,它将从示例HTML源代码中检索Part#:

columns = soup.findAll('td')
for col in columns:
    try:
        part = col.find("font", {"color": "#7b1010"}).contents[0]
        print(part)
    except:
        pass

答案 2 :(得分:-1)

lxml人声称可以使用格式错误的HTML。