Python BeautifulSoup find_all re.compile在一组标签中查找任何内容

时间:2015-07-21 20:01:16

标签: python regex beautifulsoup

这是我的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>
<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”,所以我愿意打赌我失踪的东西。在地球上,我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先,第三个标签的最后一个标签中缺少空格。这可能导致使用BeautifulSoup解析问题。

有两种方法可以使用您提供的文字轻松解决此问题:

  1. BeautifulSoup:
    html = BeautifulSoup(htmlString, 'html.parser')
    for tag in html.find_all('td', align=None):
        print(tag.string)
  2. Pure Regex(no BeautifulSoup):

    for val in re.findall(re.compile('\<td\>(.*?)\<\/td\>'), htmlString):
        print val
  3. 我能说的最好,因为当使用&#34; find_all&#34;时,BeautifulSoup正在搜索标签名称。函数,re.compile将使用正则表达式来查找与模式匹配的标记名称。例如,如果你想找到所有&#34; tbody&#34;和&#34; td&#34;标签,你可以使用这个:

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

    然后,您可以从找到的标记访问开始和结束标记中的属性或值/字符串。我还没有找到使用BeautifulSoup按照值/字符串查找标记的方法。

    如果有帮助,请参考以下几个示例:BeautifulSoup Documentation - A Regular Expression

    另外,在BeautifulSoup中,&#34; find_all&#34;中的re.compile。用于&#34;过滤/匹配&#34;,不用于捕获组。意思是,正则表达式是一种匹配的模式。在这种情况下,您无法使用(。*?)提取部分值进行比较。

答案 1 :(得分:-1)

正确的正则表达式是helpers do def emphasise word word ? "<em>#{word}</em>" : word end def bracket word word ? "(#{word})" : word end end 。使用<td>(\d+(?:\.\d+)*)</td>不需要BeautifulSoup:

re.findall