使用Python中的BeautifulSoup解析标签并打印元素

时间:2016-02-27 04:53:45

标签: python html beautifulsoup

我是Python的新手,我目前正致力于解决问题,以提高我的编码技能。我已经使用python提交了一个表单,并且在提交表单后显示的下一页中,我想收集一些数据并将其显示在我的输出中。我想要收集的所需数据位于<TR> </TR>个标记之间,并且该页面中有很多<TR> </TR>

供您参考:

<TR class="even"><TD class="id">6422275</TD><TD class="date"><NOBR>09:06:49</NOBR><BR><NOBR>27 Feb 2016</NOBR></TD><TD class="coder"><A HREF="author.aspx?id=201837">THE_ROCK</A></TD><TD class="problem"><A HREF="problem.aspx?space=1&amp;num=1000">1000<SPAN CLASS="problemname">. A+B Problem</SPAN></A></TD><TD class="language">Python 2.7</TD><TD class="verdict_ac">Accepted</TD><TD class="test"><BR></TD><TD class="runtime">0.015</TD><TD class="memory">160 KB</TD></TR>

因此,在整个HTML页面中,我想要读取名称THE_ROCK(它出现在上面的给定标记中),如果该页面中存在该名称,我想要打印完整的特定<TR> </TR>标记中的元素(如problem,problemname,verdict_ac,runtime和memory)。我知道我可以使用BeautifulSoup,但我不知道如何比较内容并打印具体需要的元素/标签。

代码:

res = br.submit()
    final_url = res.geturl()
    html_doc = br.open(final_url)
    html_read = (html_doc.read())
    soup = BeautifulSoup(data, convertEntities=BeautifulSoup.HTML_ENTITIES)
    for row in soup.find_all('TR'):
        print '\n'.join(row.stripped_strings)

我试图找到TR标签,但没有帮助,也没有打印输出。有人能告诉我我在哪里做错了。我的方法是错误的还是流程错了?你能否告诉我为什么我无法按预期获得输出。提前致谢。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

按文字查找元素,并使用find_parent()找到tr父级:

tr = soup.find(text="THE_ROCK").find_parent("tr")

答案 1 :(得分:1)

也许这会有所帮助:

soup = BeautifulSoup(devs_html, 'html.parser')
row = soup.find_all('tr', class_='even')

In [195]: row
Out[195]: [<tr class="even"><td class="id">6422275</td><td class="date"><nobr>09:06:49</nobr><br><nobr>27 Feb 2016</nobr></br></td><td class="coder"><a href="author.aspx?id=201837">THE_ROCK</a></td><td class="problem"><a href="problem.aspx?space=1&amp;num=1000">1000<span class="problemname">. A+B Problem</span></a></td><td class="language">Python 2.7</td><td class="verdict_ac">Accepted</td><td class="test"><br/></td><td class="runtime">0.015</td><td class="memory">160 KB</td></tr>]

In [196]: row[0].contents
Out[196]: 
[<td class="id">6422275</td>,
<td class="date"><nobr>09:06:49</nobr><br><nobr>27 Feb 2016</nobr></br></td>,
<td class="coder"><a href="author.aspx?id=201837">THE_ROCK</a></td>,
<td class="problem"><a href="problem.aspx?space=1&amp;num=1000">1000<span class="problemname">. A+B Problem</span></a></td>,
<td class="language">Python 2.7</td>,
<td class="verdict_ac">Accepted</td>,
<td class="test"><br/></td>,
<td class="runtime">0.015</td>,
<td class="memory">160 KB</td>]

好的,基本上我们只是通过行类(:table row)搜索行。这应该为您提供可以迭代的行列表。

只需要一行,行[0],作为一个例子,你可以看到你拥有行中包含的所有数据()。要从中获取信息,您可以执行以下操作:

In [197]: row[0].find(class_='id').text
Out[197]: u'6422275'

In [198]: row[0].find(class_='coder').text
Out[198]: u'THE_ROCK'

依此类推,直到你掌握了所有你需要的信息。

编辑:好的,如果您只想找到THE_ROCK并打印行:

for r in row:
    if 'THE_ROCK' in r.find(class_='coder').text:
        print(r)

这应该会给你整行,你可以做任何你喜欢的事情。