如果没有class或id属性,如何使用bs4/python在一组嵌套表中找到所需的表?

如果没有class或id属性,如何使用bs4/python在一组嵌套表中找到所需的表?,python,web-scraping,beautifulsoup,screen-scraping,Python,Web Scraping,Beautifulsoup,Screen Scraping,我有以下复杂的HTML结构,我必须从中解析嵌套表并从所需的表中提取。页面中有许多表格。我很安静,我不知道如何到达有数据要刮的表。这是页面的URL 我以前也做过类似的事情,发现这个库非常有用。你可以这样写: def getThis(theThingYouWantToSearch, yourHTMLstring): searchResults = re.findall('<table.*?</table>(?ims)',yourHTMLstring) import url

我有以下复杂的HTML结构,我必须从中解析嵌套表并从所需的表中提取。页面中有许多表格。我很安静,我不知道如何到达有数据要刮的表。这是页面的URL


我以前也做过类似的事情,发现这个库非常有用。你可以这样写:

def getThis(theThingYouWantToSearch, yourHTMLstring):
    searchResults = re.findall('<table.*?</table>(?ims)',yourHTMLstring)
import urllib2
from bs4 import BeautifulSoup

def filter_function(tag):
    return ((tag.name=='h3' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]) or
            (tag.name == 'p' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]))

our_url = 'http://www.teauction.com/industry/buyer/coimbuyera-z.asp'

our_page = urllib2.urlopen(our_url).read()

our_soup = BeautifulSoup(our_page)

nodes_we_want = our_soup.find_all(filter_function)

text_we_want = [node.text for node in nodes_we_want]
def获取此信息(您想要搜索的内容,您的HTMLString):

searchResults=re.findall(“我以前做过类似的事情,发现这个库非常有用。您可以编写如下内容:

def getThis(theThingYouWantToSearch, yourHTMLstring):
    searchResults = re.findall('<table.*?</table>(?ims)',yourHTMLstring)
import urllib2
from bs4 import BeautifulSoup

def filter_function(tag):
    return ((tag.name=='h3' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]) or
            (tag.name == 'p' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]))

our_url = 'http://www.teauction.com/industry/buyer/coimbuyera-z.asp'

our_page = urllib2.urlopen(our_url).read()

our_soup = BeautifulSoup(our_page)

nodes_we_want = our_soup.find_all(filter_function)

text_we_want = [node.text for node in nodes_we_want]
def获取此信息(您想要搜索的内容,您的HTMLString):

searchResults=re.findall(“使用BeautifulSoup,我们可以执行以下操作:

def getThis(theThingYouWantToSearch, yourHTMLstring):
    searchResults = re.findall('<table.*?</table>(?ims)',yourHTMLstring)
import urllib2
from bs4 import BeautifulSoup

def filter_function(tag):
    return ((tag.name=='h3' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]) or
            (tag.name == 'p' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]))

our_url = 'http://www.teauction.com/industry/buyer/coimbuyera-z.asp'

our_page = urllib2.urlopen(our_url).read()

our_soup = BeautifulSoup(our_page)

nodes_we_want = our_soup.find_all(filter_function)

text_we_want = [node.text for node in nodes_we_want]
实际上,您可以将整个过程组合成一个非常丑陋的单行程序,并使用lambda作为helper函数,但这更容易理解

这里真正的诀窍是为
我们的\u汤定义参数。查找\u all
。这需要分析页面并了解我们的目标节点的共同点-它们都是
td
节点的子节点,该节点具有
colspan
2
属性。这组共享属性对于任何其他元素都是不正确的页中的元素,因此它们是良好的筛选条件

还有其他方法可以实现相同的目标,可能有些更好,但我喜欢这一种,因为我们的输出将保持与页面上显示的顺序相同。但是,我会小心,因为文本包含非ASCII字符,确保在提取后正确处理文本

编辑:

基于对欲望输出的更新描述,这些将实现以下目的:

text\u我们希望将
作为包含名称、详细信息对的元组列表--

text\u我们希望将
作为字符串列表,每个字符串都包含一家公司的名称和详细信息(我在名称和详细信息之间插入了一个选项卡,但很容易删除)--


使用BeautifulSoup,我们可以执行以下操作:

def getThis(theThingYouWantToSearch, yourHTMLstring):
    searchResults = re.findall('<table.*?</table>(?ims)',yourHTMLstring)
import urllib2
from bs4 import BeautifulSoup

def filter_function(tag):
    return ((tag.name=='h3' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]) or
            (tag.name == 'p' and tag.parent.name=='td' and '2' in
             [tag.parent[attrib] for attrib in tag.parent.attrs.keys()]))

our_url = 'http://www.teauction.com/industry/buyer/coimbuyera-z.asp'

our_page = urllib2.urlopen(our_url).read()

our_soup = BeautifulSoup(our_page)

nodes_we_want = our_soup.find_all(filter_function)

text_we_want = [node.text for node in nodes_we_want]
实际上,您可以将整个过程组合成一个非常丑陋的单行程序,并使用lambda作为helper函数,但这更容易理解

这里真正的诀窍是为
我们的\u汤定义参数。查找\u all
。这需要分析页面并了解我们的目标节点的共同点-它们都是
td
节点的子节点,该节点具有
colspan
2
属性。这组共享属性对于任何其他元素都是不正确的页中的元素,因此它们是良好的筛选条件

还有其他方法可以实现相同的目标,可能有些更好,但我喜欢这一种,因为我们的输出将保持与页面上显示的顺序相同。但是,我会小心,因为文本包含非ASCII字符,确保在提取后正确处理文本

编辑:

基于对欲望输出的更新描述,这些将实现以下目的:

text\u我们希望将
作为包含名称、详细信息对的元组列表--

text\u我们希望将
作为字符串列表,每个字符串都包含一家公司的名称和详细信息(我在名称和详细信息之间插入了一个选项卡,但很容易删除)--

您可以使用htql from解析内容。以下是示例代码:

import urllib
URL = 'http://www.teauction.com/industry/buyer/coimbuyera-z.asp'
htmlstring = urllib.urlopen(URL).read()

import htql
d=htql.query(htmlstring, """
   <table>3.<Table>3.<tr>1.<td>1.<hr sep> {
      title=<h3>.<b> &tx; 
      address=<p>0 :tx; 
      category=<big> &tx; 
      |title is not null 
   }
   """); 

d[:1]
# [('A.M.S. TEA TRADERS', '<font face="Arial" size="2">38, Ramachandra Road <br>\r\n              R.S.Puram <br>\r\n              Coimbatore - 641002<br>\r\n              Phone -(+91 422) 470441</font>', 'Coimbatore \r\n            Buyers A ')]
导入urllib
URL='1〕http://www.teauction.com/industry/buyer/coimbuyera-z.asp'
htmlstring=urllib.urlopen(URL.read())
导入htql
d=htql.query(htmlstring,“”
3.3.1.1.{
title=。&tx;
地址=0:tx;
类别=&tx;
|标题不为空
}
"""); 
d[:1]
#[('A.M.S.茶叶贸易商','38,Ramachandra路
\r\n r.S.Puram
\r\n哥印巴托-641002
\r\n电话-(+91 422)470441','哥印巴托\r\n买家A')]
您可以使用htql from解析内容。以下是示例代码:

import urllib
URL = 'http://www.teauction.com/industry/buyer/coimbuyera-z.asp'
htmlstring = urllib.urlopen(URL).read()

import htql
d=htql.query(htmlstring, """
   <table>3.<Table>3.<tr>1.<td>1.<hr sep> {
      title=<h3>.<b> &tx; 
      address=<p>0 :tx; 
      category=<big> &tx; 
      |title is not null 
   }
   """); 

d[:1]
# [('A.M.S. TEA TRADERS', '<font face="Arial" size="2">38, Ramachandra Road <br>\r\n              R.S.Puram <br>\r\n              Coimbatore - 641002<br>\r\n              Phone -(+91 422) 470441</font>', 'Coimbatore \r\n            Buyers A ')]
导入urllib
URL='1〕http://www.teauction.com/industry/buyer/coimbuyera-z.asp'
htmlstring=urllib.urlopen(URL.read())
导入htql
d=htql.query(htmlstring,“”
3.3.1.1.{
title=。&tx;
地址=0:tx;
类别=&tx;
|标题不为空
}
"""); 
d[:1]
#[('A.M.S.茶叶贸易商','38,Ramachandra路
\r\n r.S.Puram
\r\n哥印巴托-641002
\r\n电话-(+91 422)470441','哥印巴托\r\n买家A')]
这是一个一般性问题吗?就像你有很多页面,想要一个能够跨页面工作的解决方案一样?还是你正在为这个特定页面寻找解决方案?似乎你正在问一个HTML解析问题和一个DOM遍历问题之间,或者不确定该问哪一个?现在这不是一个一般性问题,因为我发现只有t他的网站有这么大的困难。如果你包括你正在使用的代码,这将是很有帮助的,这些代码通常在这里工作,但在这里不工作。这将为提供答案提供更好的上下文。但是,对于具体案例的解决方法,请参阅下面的我的答案。这是一个一般性问题吗?就像你有很多页面,想要一个解决方案,这将是一个有效的解决方案跨越它们?或者你是在为这个特定的页面寻找解决方案?看起来你是在问一个HTML解析问题和一个DOM遍历问题之间,或者不确定该问哪一个?现在这不是一个一般性的问题,因为我发现只有这个网站有这样的困难。如果你包括你正在使用的代码,这将是很有帮助的at正常起作用,但在这里不起作用。这将为提供答案提供更好的上下文。但是,对于具体案例,请参阅下面的我的答案。这给出了左侧的表格。我试图获取右侧的个人详细信息
td
@Venky