2015-07-21 185 views
0

这里库内发现什么是我的HTML数据:Python的BeautifulSoup find_all re.compile一组标签

<td>4.2.2</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.2.zip">zip</a> (<a href="https://blah.org/blah-4.2.2.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.2.zip.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-.2.2.tar.gz">tar.gz</a> (<a href="https://blah.org/blah-4.2.2.tar.gz.md5">md5</a>|<ahref="https://blah.org/blah-4.2.2.tar.gz.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.2-IIS.zip">IISzip</a> (<a href="https://blah.org/blah-4.2.2-IIS.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.2-IIS.zip.sha1">sha1</a>)</td>, 
<td>4.2.1</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.1.zip">zip</a> (<a href="https://blah.org/blah-4.2.1.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.1.zip.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.1.tar.gz">tar.gz</a> (<a href="https://blah.org/blah-4.2.1.tar.gz.md5">md5</a> | <a href="https://blah.org/blah-4.2.1.tar.gz.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.1-IIS.zip">IIS zip</a> (<a href="https://blah.org/blah-4.2.1-IIS.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.1-IIS.zip.sha1">sha1</a>)</td>, 
<td>4.2</td> 
<td>1.0-platinum</td> 

等。

我想重复这个页面,内拉出唯一的版本号:

<td>4.2.2</td> 

标签。例如:

4.2.2

4.2.1

4.2

1.0白金

到目前为止,我曾尝试:

for tag in html.find_all('tbody', limit=1, string=re.compile("\<td\>(.*?)\<\/td\>")): 
print(tag.content) 

什么

rpart=html.find('tbody') 
for tds in rpart.find_all('td'): 
print(tds.find_all('\<td\>(.*?)\<\/td>')) 

什么

results=rpart.find_all('td', tds=re.compile("\<td\>(.*?)\<\/td\>")) 

什么

wphtml.find('tbody').find_all('td', tds=re.compile('\<td\>(.*?)\<\/td\>')) 

什么

for p in rpart.find_all('td', digits=re.compile('\<td\>(.*?)\<\/td\>')): 
print(p.contents) 

什么

我也注意到,软件rpart是类型 “的ResultSet”,所以我愿意打赌它的东西很小在我失踪。我在做什么对神而言是错误的?

回答

-1

正确的正则表达式是<td>(\d+(?:\.\d+)*)</td>。使用re.findall不需要BeautifulSoup:

import re 
html = """ 
<td>4.2.2</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.2.zip">zip</a> (<a href="https://blah.org/blah-4.2.2.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.2.zip.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-.2.2.tar.gz">tar.gz</a> (<a href="https://blah.org/blah-4.2.2.tar.gz.md5">md5</a>|<ahref="https://blah.org/blah-4.2.2.tar.gz.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.2-IIS.zip">IISzip</a> (<a href="https://blah.org/blah-4.2.2-IIS.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.2-IIS.zip.sha1">sha1</a>)</td>, 
<td>4.2.1</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.1.zip">zip</a> (<a href="https://blah.org/blah-4.2.1.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.1.zip.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.1.tar.gz">tar.gz</a> (<a href="https://blah.org/blah-4.2.1.tar.gz.md5">md5</a> | <a href="https://blah.org/blah-4.2.1.tar.gz.sha1">sha1</a>)</td>, 
<td align="center"><a href="https://blah.org/blah-4.2.1-IIS.zip">IIS zip</a> (<a href="https://blah.org/blah-4.2.1-IIS.zip.md5">md5</a> | <a href="https://blah.org/blah-4.2.1-IIS.zip.sha1">sha1</a>)</td>, 
<td>4.2</td> 
""" 
print re.findall("<td>(\\d+(?:\\.\\d+)*)</td>", html) 
+0

非常感谢,不幸的是,我卡住了使用BeautifulSoup。我忘了添加到我原来的帖子中,td标签中的一些文本具有字符,所以这就是为什么我有我的正则表达式指定以这种方式抓住它。 – metallica1973

1

首先,有在第三的最后一个标签缺失的空间。这可能会导致使用BeautifulSoup解析问题。

有两种方法,你可以用你提供的文本很容易退出这个功能:

  1. BeautifulSoup:
    html = BeautifulSoup(htmlString, 'html.parser') 
    for tag in html.find_all('td', align=None): 
        print(tag.string)
  2. 纯正则表达式(无BeautifulSoup):

    for val in re.findall(re.compile('\&lttd\>(.*?)\<\/td\>'), htmlString): 
        print val

最好我可以告诉,因为BeautifulSoup正在通过标签名称进行搜索当使用“find_all”函数时,re.compile将使用正则表达式来查找匹配模式的标签名称。例如,如果你想找到所有的“TBODY”和“TD”标签,你可以这样做:

for tag in html.find_all(re.compile('t[d|b]')): 
    print tag.string 

从被发现的标签,那么你就可以开口内访问属性或值/串并关闭标签。我还没有找到一种方法来使用BeautifulSoup通过它们的值/字符串来查找标签。

下面是与一对夫妇的例子的情况下,它可以帮助的引用:BeautifulSoup Documentation - A Regular Expression

另外,在BeautifulSoup,在一个“find_all”的re.compile是用于“过滤/匹配”,而不是捕获基团。意思是,正则表达式是匹配的模式。在这种情况下,您不能使用(。*?)提取部分值进行比较。

+0

太棒了,我仍然想知道为什么我的任何方法使用re.compile和BeautifuilSoup都不起作用。 – metallica1973

+0

我的评论太长了,所以我更新了上面的回复以更详细地回答你的问题。希望有所帮助。 –