Python BeautifulSoup查找重新编译在一组标记中查找任何内容

2024-03-29 05:42:55 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我的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>

等等。。在

我想在页面上迭代,只提取以下版本号:

^{pr2}$

标签。例如:

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”类型,所以我敢打赌我遗漏了什么。我到底做错了什么?在


Tags: httpsorgtariisallfindzipsha1
2条回答

正确的regex是<td>(\d+(?:\.\d+)*)</td>。使用re.findall不需要美化组:

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)

首先,在第三个标记的最后一个标记中缺少空格。这可能会导致使用beauthoulsoup解析时出现问题。在

有两种方法可以通过您提供的文本轻松实现:

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

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

我能说的最好,因为beauthulsoup在使用“find_all”函数时搜索标记名重新编译将使用正则表达式查找与模式匹配的标记名。例如,如果要查找所有“tbody”和“td”标记,可以使用以下命令:

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

从找到的标记中,您可以访问开始和结束标记中的属性或值/字符串。我还没有找到一种方法来使用BeautifulSoup通过标签的值/字符串来查找标签。在

以下是一些例子的参考,以防有帮助:BeautifulSoup Documentation - A Regular Expression

另外,在beauthulsoup中重新编译在“find_all”中,用于“筛选/匹配”,而不是用于捕获组。意思是,regex是一个匹配的模式。您不能使用(.*?)在这种情况下提取一部分值进行比较。在

相关问题 更多 >