Мне нужно удалить все строки, содержащие colspan<td black = "" colspan='3D"8"'>zzz</td>
, прежде чем он достигнет [i.text.strip
.
HTML:
<td black = "" colspan='3D"8"'>zzz</td>
<td>1</td>
<td>2</td>
<td>3</td>
Питон:
soup = bs.BeautifulSoup(text, 'lxml')
table = soup.find('table')
table_rows = table.find_all('tr')
for tr in table_rows:
td = tr.find_all('td')
print(td)
row = [i.text.strip('\\r\\n').strip('=\\r\\nspan>').strip('=\\r\\n').strip('<=\\r\\n/').strip('\\r\\n') for i in td]
Обновить (исправить)
for tr in table_rows:
row = [i.text.strip('\\r\\n').strip('=\\r\\nspan>').strip('=\\r\\n').strip('<=\\r\\n/').strip('\\r\\n') for i in tr.find_all('td') if not i.get('colspan')]
print(row)
Я также удалил td = tr.find_all('td')
и добавил это в понимание списка. Всем большое спасибо за помощь :)
просто поставить if not i.get('colspan')
в списке понимания?
Понимание списков Python поддерживает фильтр на лету, все, что вам нужно сделать, это поместить if not i.get('colspan')
в понимание списка, и он отфильтрует любой элемент с атрибутом colspan перед оценкой вашего expr
[expr for i in td if not i.get('colspan')]
Это должно ответить на ваш вопрос, однако меня беспокоит то, как вы строите td
, вы, кажется, перезаписываете td
в своем цикле for tr in table_rows
каждую итерацию. Оставляем только окончательный результат .find_all
in.
Чтобы полностью переопределить td
для всех будущих вычислений и отфильтровать все элементы с атрибутом colspan
-
td = list(filter(lambda x: not x.get('colspan'), td))
Я хочу удалить его перед редактированием оставшихся <td>. Некоторые файлы выходят из строя с colspan, и это портит мои данные, тем более что они мне не нужны.
@Чамбо td = list(filter(lambda x: not x.get('colspan'), td))
Почему вы хотите удалить его?