BeautifulSoup-根据其他孩子的父母的位置查找孩子

时间:2019-06-16 02:14:57

标签: python python-3.x beautifulsoup css-selectors parent-child

我想使用python,beautifulsoup等查找特定日期的数据。有问题的日期IMPORTANT DATEMar. 31, 2018,如下所示。

<tr class="ro">
<td class="pl " style="border-bottom: 0px;" valign="top"><a class="a" href="javascript:void(0);" onclick="top.Show.showAR( this, 'defref_dei_DocumentPeriodEndDate', window );">IMPORTANT DATE</a></td>
<td class="text">Mar. 31,  2018<span></span>
</td>
<td class="text">&#160;<span></span>
</td>
</tr>

我正在使用以下代码行来标识IMPORTANT DATE

for item in soup.find('td', text='Document Period End Date').parent.find_all('td', {'class':['text']}):
    if len(item.text.strip()) > 0:
        report_date = [item.text.strip()]
        print(report_date)

请注意if len(item...)的使用。这是摆脱&#160的一种骇人听闻的方法,但是它可以工作。赞赏这里提出的任何更好的建议,但不是我问题的主要重点。...继续进行下去。

我的主要问题是,如果我们确定IMPORTANT DATE子代的位置是#1(请参见下文),那么我们如何才能将某些元素的第一个子代(同祖父母) ?见下文。

<tr>
<th class="tl" colspan="1" rowspan="1"><div style="width: 200px;"><strong>Condensed Consolidated Balance Sheets - USD ($)<br> $ in Thousands</strong></div></th>
<th class="th"><div>Mar. 31, 2018</div></th> # <-IMPORTANT DATE, 1st 
<th class="th"><div>Dec. 31, 2017</div></th> # <-wrong date 
</tr>
<tr class="ro">
<td class="pl " style="border-bottom: 0px;" valign="top"><a class="a" href="javascript:void(0);" onclick="top.Show.showAR( this, 'defref_us-gaap_InventoryNet', window );">Inventories, net</a></td>
<td class="nump">76,579<span></span> # <- data for important date 
</td>
<td class="nump">92,376<span></span> # <- data from wrong date
</td>
</tr>

要抛出曲线球,有时重要数据的位置不是IMPORTANT DATE的位置,因为我认为在其父<tr>元素下有一些标题列。见下文。

<tr>
<th class="th" colspan="1">3 Months Ended</th>
<th class="th" colspan="1"></th>
</tr>
<tr>
<th class="th"><div>Mar. 31, 2018</div></th> #<- IMPORTANT DATE, 3rd
<th class="th"><div>Dec. 31, 2017</div></th>
<tr class="ro">
<td class="pl " style="border-bottom: 0px;" valign="top"><a class="a" href="javascript:void(0);" onclick="top.Show.showAR( this, 'defref_us-gaap_LongTermDebt', window );">Long-term debt</a></td>
<td class="nump">data for important date<span></span> #<- important data is 1st
</td>
<td class="nump">unimportant data<span></span>
</td>

我计划要做的是1)在python中创建对我们IMPORTANT DATE的引用,report_date,然后2)将重要数据的日期与我们的IMPORTANT DATE进行比较最后3)返回重要数据。但是,在1)和2)之间的某个地方,我的代码崩溃了,因为尝试以下几行:

for item in soup.select('filename:contains("' + filename + '")'):
    for item in soup.find('td', text='Document Period End Date').parent.find_all('td', {'class':['text']}):
        if len(item.text.strip()) > 0:
            report_date = [item.text.strip()]
    for th in item.find_all('th', text=report_date):

我知道css_selector soup.select("p > a:nth-of-type(2)")会派上用场,但我还没有走到那一步。我似乎卡住了。

有人可以在这里伸出援手吗?

soup can be found here

1 个答案:

答案 0 :(得分:0)

您可以通过执行public class BaseBox { public string Title { get; set; } public string Status { get; set; } public object Data { get; set; } } public class ChildBox: BaseBox { public string value1 { get; set; } public string value2 { get; set; } } public class ChildBox2: BaseBox { public string valueproperty { get; set; } public string valueproperty2 { get; set; } } 从行()中获取最后两个元素(<td><th>)。这样,您将始终忽略该可选的第一标题列。然后,您可以执行<tr>函数来连接数据:

tr.select('td, th')[-2:]

打印:

zip()