2014-08-29 118 views
-1

我试图循环遍历表格行并打印某些td。我可以单独打印每个文件,但我不确定如何同时打印同一行上的两个td。我想知道的是我在何处放置for循环和打印标签以使其工作。Python:Beautifulsoup - 解析表格

<div id="main"> 
    <table> 
     <tbody> 
      <tr> 
       <td><span class="bold">answer</span> </td> 
       <td></td> 
       <td> 
        <option value="1|0|%" selected="selected">%</option> 
        <option value="100|0|fraction">fraction</option> 
        <option value="100|0|ratio">ratio</option> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</div> 

我试图做到这一点是

def summary(url, i): 
html = wget(url) 
soup = BeautifulSoup(html) 
    for row in soup.findAll('div', {'id': 'main'}): 
     for ops in row.findAll('tr'): 
      for tds1 in ops.findAll('td'): 
       for opt in tds1.findAll('option', {'selected': 'selected'}): 
        return opt 
     for ops in row.findAll('tr'): 
      for tds1 in ops.findAll('td'): 
       for spans in tds1.findAll('span', {'class': 'bold'}): 
        return spans 
      print (i, opt, spans) 
+1

您正在分析的HTML和预期的输出将有助于更正代码 – shaktimaan 2014-08-29 00:41:03

+0

您确定在代码中有'return opt'吗?这意味着这个代码从不打印任何东西。它也看起来像缩进问题:你确定以'汤'开始的行是缩进? – 2014-08-29 00:41:09

+0

另外,你是什么意思“同时在同一行打印两个”? – 2014-08-29 00:41:38

回答

0

想想你想在英国做什么,然后制定出如何将其转化为Python的。

您想逐行阅读,然后打印同一行上同一行中的两列。你已经得到了大多数执行此代码:

# Go row by row 
for ops in row.findAll('tr'): 
    # Go column by column 
    for tds1 in ops.findAll('td'): 
     # Print columns on the same line 
     print(tds1, end=' ') 
    # Make sure to end each line after the last column 
    print() 

我不知道你的所有其他代码是,你为什么这样做外循环两次,为什么你要搜索对于列中的其他内容,为什么只要找到第一个值就会返回,等等 - 但和end = ' '是您缺少的部分:这就是您在同一行上打印多个内容的方式。

+0

我不想打印所有td标签或td标签中的所有数据,只是第一个td和另一个td标签中的选项选择。我添加了我想解析的html格式 – Marqui678 2014-08-29 01:07:58

+0

我不确定如何构建我正在尝试执行的操作。我在运行代码时遇到错误。 '/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python/Users/mike/PycharmProjects/convertHtml/tables_parse.py 文件“/Users/mike/PycharmProjects/convertHtml/tables_parse.py”,第42行 打印(tds1,结束=”“) ^ 语法错误:无效的语法 过程与退出代码完成1' – Marqui678 2014-08-29 01:14:53

+0

@ Marqui678:OK,让你在使用Python 2.7,但如果想要使用Python 3风格的'打印' - 作为一个函数调用。你的原始代码可以避免这种情况,尽管它增加了额外的括号和'repr',而不是'str',因为它没有使用任何关键字参数。我已经添加了'end =''',这会使其中断。如果你想在2.7中使用3.x风格的'print',你需要在文件的顶部从__future__ import print_function'。如果你想做2.x样式的'print'语句,去掉'print'语句中的括号,并将'end ='''改为''后面的','。 – abarnert 2014-08-29 01:45:49