Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Beautifulsoup在表中获取值_Python_Screen Scraping_Beautifulsoup_Html Content Extraction - Fatal编程技术网

Python Beautifulsoup在表中获取值

Python Beautifulsoup在表中获取值,python,screen-scraping,beautifulsoup,html-content-extraction,Python,Screen Scraping,Beautifulsoup,Html Content Extraction,我在努力刮 并获取“所有者名称” 我所拥有的东西很管用,但真的很难看,我肯定不是最好的,所以我正在寻找更好的方法。 以下是我所拥有的: 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.nextSibli

我在努力刮 并获取“所有者名称” 我所拥有的东西很管用,但真的很难看,我肯定不是最好的,所以我正在寻找更好的方法。 以下是我所拥有的:

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>

业主名称
皮尔彻唐纳德L

哇,有很多关于beautifulsoup的问题,我看了一遍,但没有找到对我有帮助的答案,希望这不是一个重复的问题,这是一个轻微的改进,但我不知道如何摆脱这三位家长

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

这是一个小小的进步,但我不知道如何摆脱这三位家长

x[0].parent.parent.parent.findAll('td')[1].string
Edit:显然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
这对于页面结构中的微小变化是相当可靠的:找到感兴趣的单元格后,它将循环它的父单元格,直到找到表标记,然后遍历该表中所有不为空(或仅为空白)的可导航字符串,不包括
所有者
标题。

Edit:显然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

这对于页面结构中的微小更改相当健壮:找到感兴趣的单元格后,它将循环其父元素,直到找到表标记,然后遍历该表中所有不为空(或仅为空白)的可导航字符串,不包括
所有者
标题。

这是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)")]

这是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)")]

谢谢你的回答,我得到了一个错误单元格。名称没有属性名称我想我可以使用try,不太熟悉使用try,有没有更好的方法来解决这个问题?你提供的URL没有这样的错误w/我的代码(这就是为什么我在代码的第二行有
.parent
:从可导航字符串向上移动到有名称的标记)。什么确切的URL与我在回答中发布的代码有这样的问题?我刚刚检查了这个URL,没有
标记。我想你只需要查找“所有者名称”表列标题,然后读取该表所有行中的值。就像Paul说的没有tboby一样,我使用的url就是发布的url。我想对我来说最有意义的解决方案是能够根据某些内容找到一个表。然后在表中选择我想要的项。(soup(查找一个具有“所有者名称”的表)@Vincent,那么为什么显示为“相关HTML”一个有
tbody
?啊,好吧,用
table
代替第三行的
tbody
。在这里,让我编辑答案以显示这一细微的变化。谢谢回答,我得到了一个错误单元格。name没有属性名,我想我可以使用try,不太熟悉try,有更好的方法解决这个问题吗?URL您提供的代码中没有此类错误(这就是为什么我在代码的第二行中有
.parent
:从可导航字符串上移到具有名称的标记)。什么确切的URL与我在回答中发布的代码有这样的问题?我刚刚检查了此URL,没有
标记。我想您只需查找“所有者名称”表列标题,然后读取该表所有行中的值。就像Paul说的没有tboby一样,我使用的url就是发布的url。我想对我来说最有意义的解决方案是能够根据某些内容找到一个表。然后在表中选择我想要的项。(soup(查找一个具有“所有者名称”的表)@Vincent,那你为什么用
tbody
显示为“相关HTML”呢?啊,好吧,在第三行中使用
table
而不是
tbody
。这里,让我编辑答案来显示这一细微的变化。