我想在网页上找一个日期。
原始网页源代码如下:
<TR class=odd>
<TD>
<TABLE class=zp>
<TBODY>
<TR>
<TD><SPAN>Expiry Date</SPAN>2016</TD></TR></TBODY></TABLE></TD>
<TD> </TD>
<TD> </TD></TR>
我想拿起'2016',但我失败了。我能做的最多就是:
page = urllib2.urlopen('http://www.thewebpage.com')
soup = BeautifulSoup(page.read())
a = soup.find_all(text=re.compile("Expiry Date"))
我试过了:
b = a[0].findNext('').text
print b
和
b = a[0].find_next('td').select('td:nth-of-type(1)')
print b
它们都没有成功。
有任何帮助吗?感谢。
答案 0 :(得分:1)
有多种选择。
选项#1(使用CSS selector,非常明确地指示元素的路径):
from bs4 import BeautifulSoup
data = """
<TR class="odd">
<TD>
<TABLE class="zp">
<TBODY>
<TR>
<TD>
<SPAN>
Expiry Date
</SPAN>
2016
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD> </TD>
<TD> </TD>
</TR>
"""
soup = BeautifulSoup(data)
span = soup.select('tr.odd table.zp > tbody > tr > td > span')[0]
print span.next_sibling.strip() # prints 2016
我们基本上是这样说的:给我直接位于span
内的td
标记,该tr
直接位于直接位于tbody
内的table
内部带有zp
类的tr
标记位于带有odd
类的span
标记内。然后,我们使用next_sibling
获取span
代码后的文字。
选项#2(查找span = soup.find('span', text=re.compile('Expiry Date'))
print span.next_sibling.strip() # prints 2016
by text;认为它更具可读性)
re.compile()
需要 import re
,因为文本周围可能有多行和其他空格。不要忘记{{1}}模块。
答案 1 :(得分:0)
css选择器的替代方案是:
import bs4
data = """
<TR class="odd">
<TD>
<TABLE class="zp">
<TBODY>
<TR>
<TD>
<SPAN>
Expiry Date
</SPAN>
2016
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD> </TD>
<TD> </TD>
</TR>
"""
soup = bs4.BeautifulSoup(data)
exp_date = soup.find('table', class_='zp').tbody.tr.td.span.next_sibling
print exp_date # 2016
要了解BeautifulSoup,我建议您阅读documentation。