使用BeautifulSoup查找所有HTML元素

时间:2019-01-16 03:10:32

标签: python html python-3.x beautifulsoup

我正在尝试从杂乱无章的各种标记的网站解析此HTML。这是HTML的示例,代码中包含字符串“ failed”。

<g style="opacity: 1;" class="node enter failed" transform="translate(743.1833267211914,17.941665649414062)" id="return_qtd_validate" data-toggle="tooltip" data-original-title="Task_id: return_qtd_validate<br>Run: 2018-11-27T06:00:00<br>Operator: PythonOperator<br>Started: 2018-11-28T06:09:40.070799<br>Ended: 2018-11-28T06:10:10.649864<br>Duration: 30.5791<br>State: failed<br>"><rect rx="5" ry="5" x="-157.625" y="-17.94166660308838" width="315.25" height="35.88333320617676" fill="#fff" style="fill: rgb(255, 242, 242);"></rect><g transform="translate(-147.625,-7.941666603088379)"><text text-anchor="left" style="; fill:#000;"><tspan dy="1em" x="1">return_qtd_validate</tspan></text></g></g>

这是另一个示例,代码中还有另一个“失败”。

<g style="opacity: 1;" class="node enter failed" transform="translate(579.2583389282227,17.941665649414062)" id="update_release_yyyy_mm_dd__jpe4_update_release_yyyy_mm_dd_source_validate" data-toggle="tooltip" data-original-title="Task_id: update_release_yyyy_mm_dd__jpe4_update_release_yyyy_mm_dd_source_validate<br>Run: 2019-01-14T18:00:00<br>Operator: PythonOperator<br>Started: 2019-01-15T18:02:17.374226<br>Ended: 2019-01-15T18:02:21.419314<br>Duration: 4.04509<br>State: failed<br>"><rect rx="5" ry="5" x="-314.70001220703125" y="-17.94166660308838" width="629.4000244140625" height="35.88333320617676" fill="#fff" style="fill: rgb(255, 242, 242);"></rect><g transform="translate(-304.70001220703125,-7.941666603088379)"><text text-anchor="left" style="; fill:#000;"><tspan dy="1em" x="1">update_release_yyyy_mm_dd__update_release_yyyy_mm_dd_source_validate</tspan></text></g></g>

我正在使用BeautifulSoup,下面的代码将一堆链接附加到列表中。这部分工作正常。当我尝试搜索错误并将所有错误(来自我正在遍历的所有链接)附加到另一个列表时,我陷入了困境。

    all_links.append(url)

all_errors = []
for link in all_links:
    wd.get(link)
    errors  = requests.get(link)
    data = errors.text
    pool = bs(data, 'lxml') # where html contains the whole html as string
    for item in pool.findAll('g', attrs={'id' : 'node enter failed'}):
        all_errors.append(item.string)

请注意,所有ID标签均不同。也许像这样的事情会起作用...

for item in pool.findAll('g', 'id' = re.compile(<>'')): 
    all_errors.append(item.string)

基本上,我想查找与class="node enter failed"相关联的每个ID。

没有任何内容附加到all_errors,但肯定应该有几个字符串被推入该列表。也许gidclass已关闭。我不确定问题出在哪里。有帮助吗?

1 个答案:

答案 0 :(得分:1)

您做错了。如果您观察到,class具有属性node enter failed而不是idid的值为return_qtd_validate。因此您的代码将是:

for link in all_links: 
    wd.get(link) 
    errors = requests.get(link) 
    data = errors.text 
    pool = bs(data, 'lxml')
    for item in pool.findAll('g', attrs={'id' : 'return_qdt_validate'}): 
        all_errors.append(item.string)

编辑:

根据更新的问题和评论,您需要找到一个匹配所有错误的静态属性。在您的示例中,如果显示了两个错误示例,我都可以看到class属性是静态的。因此,此代码应该有效(只需将id替换为class)。

for link in all_links: 
    wd.get(link) 
    errors = requests.get(link) 
    data = errors.text 
    pool = bs(data, 'lxml')
    for item in pool.findAll('g', attrs={'class' : 'node enter failed'}): 
        all_errors.append(item.string)