![](/img/trans.png)
[英]BeautifulSoup - Avoid considering elements containing <br> as different elements using findAll
[英]Using BeautifulSoup to FindAll HTML Elements
我试图从一个充斥着各种不同标签的网站解析这个 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
没有附加任何all_errors
但肯定应该有几个字符串被推入该列表。 也许g
或id
或class
已关闭。 我不确定问题出在哪里。
你这样做是错的。 如果您观察到, 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
属性在您显示的两个错误示例中都是静态的。 所以这段代码应该可以工作(只需用class
替换id
)。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.