【问题标题】:Matching specific table within HTML, BeautifulSoup匹配 HTML 中的特定表格,BeautifulSoup
【发布时间】:2013-03-29 18:42:03
【问题描述】:

我有这个问题。我试图抓取的页面上有几个类似的表格。

<h2 class="tabellen_ueberschrift al">Points</h2>
<div class="fl" style="width:49%;">     
<table class="tabelle_grafik lh" cellpadding="2" cellspacing="1">

它们之间的唯一区别是h2标签中的文本,这里:Points

如何指定需要在哪个表中搜索?

我有这段代码,需要调整h2标签因子:

my_tab = soup.find('table', {'class':'tabelle_grafik lh'})

需要一些帮助。

【问题讨论】:

    标签: python python-2.7 beautifulsoup


    【解决方案1】:

    看起来这是xpath 的工作。但是,BeautifulSoup 不支持 XPath 表达式

    考虑切换到lxmlscrapy

    仅供参考,对于像这样的测试 xml:

    <html>
    <h2 class="tabellen_ueberschrift al">Points</h2>  
    <div class="fl" style="width:49%;">   
    <table class="tabelle_grafik lh" cellpadding="2" cellspacing="1">a</table>
    </div>
    
    <h2 class="tabellen_ueberschrift al">Illegal</h2>
    <div class="fl" style="width:49%;">     
    <table class="tabelle_grafik lh" cellpadding="2" cellspacing="1">b</table>
    </div>
    </html>
    

    在 h2="Points" 之后的 div 中查找类为 "tabelle_grafik lh" 的表的 XPath 表达式为:

    //table[@class="tabelle_grafik lh" and ../preceding-sibling::h2[1][text()="Points"]]
    

    【讨论】:

    • 这可以通过 BeautifulSoup 来完成。您可以通过Siblings 遍历表格并找到您要查找的表格。看看 Vorsprung 的回答。
    • @serk,是的,谢谢。我只想指出xpath 是适合这项工作的工具。所以我认为答案可以留在这里作为问题的替代解决方案。
    【解决方案2】:

    这对我有用。找到“previousSiblings”,如果您在具有不同文本内容的 h2 标记之前找到带有文本“Points”的 h2,那么您找到了一个好表

    from BeautifulSoup import BeautifulSoup
    
    t="""
    <h2 class="tabellen_ueberschrift al">Points</h2>
    <table class="tabelle_grafik lh" cellpadding="2" cellspacing="1">
    <th><td>yes me!</th></td></table>
    <h2 class="tabellen_ueberschrift al">Bad</h2>
    <table class="tabelle_grafik lh" cellpadding="2" cellspacing="1">
    <th><td>woo woo</td></th></table>
    """
    
    soup = BeautifulSoup(t)
    
    for ta in soup.findAll('table'):
        for s in ta.findPreviousSiblings():
            if s.name == u'h2':
                if s.text == u'Points':
                    print ta 
                else:
                    break;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2021-05-31
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2019-03-01
      • 2011-01-04
      相关资源
      最近更新 更多