2017-05-02 5 views
0

BeautifulSoupを使用して小さなコードを作成する際に役立つ2つのことができます。BeautifulSoup Pythonで文字列の日付のリストを取得するには

まず、以下のコードで見つかった日付のみを取得できます。 findAll <td>02/02/2011</td>を入力し、リストに格納します。私の問題は、いくつかのtdタグがあるため、具体的に日付文字列を取得する方法がわかりません。

第2に、日付のリストが取得された後、私は2つの変数を持ちます。 1つの変数には1つの日付のみが含まれ、もう1つの変数にはすべての日付のリストが含まれます。たとえば、date_lst_single = "<td>01/04/2011</td>"date_lst_all = ["LIST OF ALL DATES"]です。

最後に、私は日時依存性を使用するFind条件をいくつか作成することができますが、その背後に論理が必要です。この場合、date_lst = <td>02/02/2011</td>にある日付が何であっても、その前の日付のみを検索したいと思います。たとえば、以下のコードでは、そのような日付の前の日付は<td>01/04/2011</td>で、日付を取り出して新しい変数に格納します。

<td>10/24/2011</td>, 
<td><span class="match">11</span> - <span class="match">12</span> - <span class="match">17</span> - 31 - 33</td>, 
<span class="match">11</span>, 
<span class="match">12</span>, 
<span class="match">17</span>, 
<td>8,210</td>, 
<td>$10.50</td>, 
<tr><td>06/15/2011</td><td>1 - 7 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">17</span></td><td>15,369</td><td>$6.50</td></tr>, 
<td>06/15/2011</td>, 
<td>1 - 7 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">17</span></td>, 
<span class="match">11</span>, 
<span class="match">12</span>, 
<span class="match">17</span>, 
<td>15,369</td>, 
<td>$6.50</td>, 
<tr class="alt"><td>01/04/2011</td><td><span class="match">11</span> - <span class="match">12</span> - <span class="match">20</span> - 21 - 27</td><td>10,752</td><td>$15.00</td></tr>, 
<td>01/04/2011</td>, 
<td><span class="match">11</span> - <span class="match">12</span> - <span class="match">20</span> - 21 - 27</td>, 
<span class="match">11</span>, 
<span class="match">12</span>, 
<span class="match">20</span>, 
<td>10,752</td>, 
<td>$15.00</td>, 
<tr><td>09/24/2009</td><td>2 - 3 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">17</span></td><td>11,406</td><td>$7.50</td></tr>, 
<td>09/24/2009</td>, 
<td>2 - 3 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">17</span></td>, 
<span class="match">11</span>, 
<span class="match">12</span>, 
<span class="match">17</span>, 
<td>11,406</td>, 
<td>$7.50</td>, 
<tr class="alt"><td>08/08/2009</td><td><span class="match">12</span> - <span class="match">20</span> - 26 - 28 - <span class="match">30</span></td><td>10,267</td><td>$11.00</td></tr>, 
<td>08/08/2009</td>, 
<td><span class="match">12</span> - <span class="match">20</span> - 26 - 28 - <span class="match">30</span></td>, 
<span class="match">12</span>, 
<span class="match">20</span>, 
<span class="match">30</span>, 
<td>10,267</td>, 
<td>$11.00</td>, 
<tr><td>05/05/2009</td><td>8 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">20</span> - 26</td><td>11,260</td><td>$8.00</td></tr>, 
<td>05/05/2009</td>, 
<td>8 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">20</span> - 26</td>, 
<span class="match">11</span>, 
<span class="match">12</span>, 
<span class="match">20</span>, 
<td>11,260</td>, 
<td>$8.00</td>, 
<tr class="alt"><td>04/07/2009</td><td>10 - <span class="match">11</span> - <span class="match">12</span> - 16 - <span class="match">17</span></td><td>11,163</td><td>$8.50</td></tr>, 
<td>04/07/2009</td>, 
<td>10 - <span class="match">11</span> - <span class="match">12</span> - 16 - <span class="match">17</span></td>, 
<span class="match">11</span>, 
<span class="match">12</span>, 
<span class="match">17</span>, 
<td>11,163</td>, 
<td>$8.50</td>, 
<tr><td>01/31/2009</td><td>3 - <span class="match">17</span> - <span class="match">20</span> - <span class="match">30</span> - 34</td><td>10,086</td><td>$11.50</td></tr>, 
<td>01/31/2009</td>, 
<td>3 - <span class="match">17</span> - <span class="match">20</span> - <span class="match">30</span> - 34</td>, 
<span class="match">17</span>, 
<span class="match">20</span>, 
<span class="match">30</span>, 
<td>10,086</td>, 
<td>$11.50</td>, 
<tr class="alt"><td>08/06/2008</td><td>4 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">30</span> - 32</td><td>9,497</td><td>$11.00</td></tr>, 
<td>08/06/2008</td>, 
<td>4 - <span class="match">11</span> - <span class="match">12</span> - <span class="match">30</span> - 32</td>, 
<span class="match">11</span>, 
<span class="match">12</span>, 
<span class="match">30</span>, 
<td>9,497</td>, 
<td>$11.00</td>, 

UPDATE:場合

これは他の誰かを助けるかもしれない、私が要求したコードの最後の部分は以下の通りです。私はこの投稿で私が受け取った助けに加わった。

#Input date 
five_to_date = ['09/01/2016'] 
def isDate(tag): 
    if tag.name=='td': 
     return bool(re.match('\d\d\/\d\d\/\d\d', tag.text)) 
    else: 
     return False 

#store in list 
tds_three_five = three_five.find_all(isDate) 
dates_three = [p.text for p in tds_three_five] 
#target date 
dates_three_cnv = [datetime.strptime(x, '%m/%d/%Y').date() for x in 
dates_three] 

for i in range(1): 
    _lst_all_threefive = [] 
    for j in dates_three_cnv: 
     if j < five_to_date: 
      _lst_all_threefive.append(j) 
    three_five_to_calc = _lst_all_threefive[0] # we only want one date 
#Perform calculation of input date minus target date. 
delta = five_to_date - three_five_to_calc 

答えて

0

このようにしてtdタグの日付を復元することができます。

>>> HTML = open('trial.htm').read() 
>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup(HTML, 'lxml') 
>>> import re 
>>> def isDate(tag): 
...  if tag.name=='td': 
...   return bool(re.match('\d\d\/\d\d\/\d\d', tag.text)) 
...  else: 
...   return False 
... 
>>> tds = soup.find_all(isDate) 
>>> tds 
[<td>10/24/2011</td>, <td>06/15/2011</td>, <td>06/15/2011</td>, <td>01/04/2011</td>, <td>01/04/2011</td>, <td>09/24/2009</td>, <td>09/24/2009</td>, <td>08/08/2009</td>, <td>08/08/2009</td>, <td>05/05/2009</td>, <td>05/05/2009</td>, <td>04/07/2009</td>, <td>04/07/2009</td>, <td>01/31/2009</td>, <td>01/31/2009</td>, <td>08/06/2008</td>, <td>08/06/2008</td>] 
>>> dates = [_.text for _ in tds] 
>>> dates 
['10/24/2011', '06/15/2011', '06/15/2011', '01/04/2011', '01/04/2011', '09/24/2009', '09/24/2009', '08/08/2009', '08/08/2009', '05/05/2009', '05/05/2009', '04/07/2009', '04/07/2009', '01/31/2009', '01/31/2009', '08/06/2008', '08/06/2008'] 

質問の残りの部分が何であるかは完全にはわかりません。しかし、私はあなたがこれから必要なものを集めることができると思う。

+0

どうもありがとうございました –

+0

あなたが最も歓迎しています。 –

0

lxml(またはBeautifulSoup with lxml)を使用してファイルを解析できます。するとその後、あなたは有効な日付でノードを識別するための関数を定義することができ、すべての<td>

from lxml import etree 

tree = etree.parse(path) 
td_nodes = tree.xpath('//td') 

を選択するために、XPath式を使用します。

def is_date(node): 
    try: 
     return datetime.datetime.strptime(node.text, '%m/%d/%Y') 
    except ValueError: 
     return None 

あなたがに添付日付を見つけるために、この機能を使用することができますtdノード:日付と

nodes_with_date = {node: is_date(node) for node in td_nodes} 

tdのリストは次のように抽出することができます。

date_list = [node for node, date in nodes_with_date.items() 
      if date] 

指定した日付の前にtdのリストは、次のとおりです

date_list = [node for node, date in nodes_with_date.items() 
      if date and date < given_date] 
+0

ありがとう –

関連する問題