Beautifulsoup在表中获得价值

时间:2009-11-29 23:46:14

标签: python screen-scraping beautifulsoup html-content-extraction

我想要刮掉 http://www.co.jefferson.co.us/ats/displaygeneral.do?sch=000104 并获得“所有者姓名” 我有什么作品,但是真的很丑,而且我不确定,所以我正在寻找更好的方法。 这就是我所拥有的:

soup = BeautifulSoup(url_opener.open(url))            
x = soup('table', text = re.compile("Owner Name"))
print 'And the owner is', x[0].parent.parent.parent.tr.nextSibling.nextSibling.next.next.next

相关的HTML是

<td valign="top">
    <table border="1" cellpadding="1" cellspacing="0" align="right">
    <tbody><tr class="tableheaders">
    <td>Owner Name(s)</td>
    </tr>

    <tr>

    <td>PILCHER DONALD L                         </td>
    </tr>

    </tbody></table>
</td>
哇,有很多关于beautifulsoup的问题,我看了看他们但找不到帮助我的答案,希望这不是一个重复的问题

3 个答案:

答案 0 :(得分:5)

编辑:显然OP发布的HTML谎言 - 实际上没有tbody标记可供查找,即使他在此HTML中包含了这一点。因此,更改为使用table而不是tbody)。

由于您可能需要多个表行(例如,查看您给出的一个兄弟URL,最后一个数字,4,变为5),我建议循环如下:

# locate the table containing a cell with the given text
owner = re.compile('Owner Name')
cell = soup.find(text=owner).parent
while cell.name != 'table': cell = cell.parent
# print all non-empty strings in the table (except for the given text)
for x in cell.findAll(text=lambda x: x.strip() and not owner.match(x)):
  print x

对于页面结构的微小变化,这是相当健壮的:找到感兴趣的单元格后,它会循环其父项,直到找到表格标记,然后在该表格中的所有可导航字符串中为空(或者只是空格) ),不包括owner标题。

答案 1 :(得分:3)

这是Aaron DeVore从Beautifulsoup讨论小组的回答,它对我有用。

soup = BeautifulSoup(...)
label = soup.find(text="Owner Name(s)")

需要Tag.string来获取实际的名称字符串

name = label.findNext('td').string

如果你正在做一大堆,你甚至可以进行列表理解。

names = [unicode(label.findNext('td').string) for label in
soup.findAll(text="Owner Name(s)")]

答案 2 :(得分:1)

这是一个小小的改进,但我无法弄清楚如何摆脱三个父母。

x[0].parent.parent.parent.findAll('td')[1].string