J'essaie d'obtenir la taille dans une page html ..

Le HTML est

<tr>
<td style="padding-left: 5px;" class="subheader" 
valign="top" width="147" align="right">Size</td>
<td valign="top" style="padding-left: 5px;">1.64 GB in 2 
file(s)</td>
</tr>

J'ai essayé

size = re.search (r"""<tr>
<td style="padding-left: 5px;" class="subheader" 
valign="top" width="147" align="right">Size</td>
<td valign="top" style="padding-left: 5px;">.+ in \d
file(s)</td>
</tr>""", Text) 

Mais j'obtiens un type None .. Je n'en ai besoin que pour donner la partie de 1,64 Go .. Quel est le problème?

0
maurizio de ruggiero 13 avril 2018 à 18:52

3 réponses

Meilleure réponse

BeautifulSoup est une meilleure option pour l'analyse html. Cependant, si vous souhaitez utiliser une expression régulière. Voici ce que vous pouvez faire.

import re
regex = r"<td.*>\s*(\d+[.]\d+\s+\w+).*<\/td>"
test_str = ("<tr> \n"
    "<td style=\"padding-left: 5px;\" class=\"subheader\"  \n"
    "valign=\"top\" width=\"147\" align=\"right\">Size</td> \n"
    "<td valign=\"top\" style=\"padding-left: 5px;\">1.64 GB in 2  \n"
    "file(s)</td> \n"
    "</tr>")

matches = re.search(regex, test_str, re.DOTALL)
try:
    print(matches.group(1))
except Exception as e:
    print (e)

Sortie

1.64 GB
1
Sumit Jha 13 avril 2018 à 16:39

En général, j'éviterais d'utiliser l'expression régulière pour analyser HTML. Il est probablement plus facile pour vous d'utiliser beautifulsoup ou une autre bibliothèque similaire. Utilisation de beautifulsoup en python:

In [1]: from bs4 import BeautifulSoup

In [2]: soup = BeautifulSoup(html, 'html.parser')

In [3]: soup
Out[3]: 
<tr>
<td align="right" class="subheader" style="padding-left: 5px;" valign="top" width="147">Size</td>
<td style="padding-left: 5px;" valign="top">1.64 GB in 2 
file(s)</td>
</tr>

In [4]: soup.tr
Out[4]: 
<tr>
<td align="right" class="subheader" style="padding-left: 5px;" valign="top" width="147">Size</td>
<td style="padding-left: 5px;" valign="top">1.64 GB in 2 
file(s)</td>
</tr>

In [5]: soup.tr.find_all('td')
Out[5]: 
[<td align="right" class="subheader" style="padding-left: 5px;" valign="top" width="147">Size</td>,
 <td style="padding-left: 5px;" valign="top">1.64 GB in 2 
 file(s)</td>]

In [6]: soup.tr.find_all('td')[1]
Out[6]: 
<td style="padding-left: 5px;" valign="top">1.64 GB in 2 
file(s)</td>

In [7]: soup.tr.find_all('td')[1].text
Out[7]: '1.64 GB in 2 \nfile(s)'

Si vous avez besoin d'une méthode plus ciblée de recherche dans le HTML, beautifulsoup fournit un certain nombre de ces.

Une fois que vous avez le texte en question, vous pouvez l'analyser avec une regex, ou des méthodes de chaîne, ou comme vous le souhaitez. Ne connaissant pas tout votre document HTML ou à quoi ressemblent les autres éléments td comme celui-ci, je ne saurais pas vous guider dans la construction de l'expression exacte ou de la façon exacte d'utiliser beautifulsoup. Mais cela devrait vous rapprocher.

1
ryanmrubin 13 avril 2018 à 16:07

Il est préférable d'analyser le code HTML à l'aide d'un analyseur HTML.

Ex: utilisation de BeautifulSoup

from bs4 import BeautifulSoup
s = """<tr>
<td style="padding-left: 5px;" class="subheader" 
valign="top" width="147" align="right">Size</td>
<td valign="top" style="padding-left: 5px;">1.64 GB in 2 
file(s)</td>
</tr>"""
soup = BeautifulSoup(s, "html.parser")
print(soup.tr.td.findNext('td').text)
print(re.findall("\d+.\d+ [A-Z]+", soup.tr.td.findNext('td').text.strip()))   #Use regex to get only the required data.

Sortie:

1.64 GB in 2 
file(s)
[u'1.64 GB']
1
Rakesh 13 avril 2018 à 16:07