我正在尝试从杂乱无章的各种标记的网站解析此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
,但肯定应该有几个字符串被推入该列表。也许g
或id
或class
已关闭。我不确定问题出在哪里。有帮助吗?
答案 0 :(得分:1)
您做错了。如果您观察到,class
具有属性node enter failed
而不是id
。 id
的值为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)