Python - beautifulsoup: Find & lt; li & gt; by data-author - добавить фильтр [duplicate]

Как говорили другие, это новый синтаксис для создания функций.

Однако этот вид функций отличается от обычных:

  • Они связывают this стоимость. Как объяснено , spec , An ArrowFunction не определяет локальные привязки для arguments, super, this или new.target. Любая ссылка на arguments, super, this или new.target в ArrowFunction должна быть разрешена к привязке в лексически закрывающей среде. Обычно это будет функциональная среда сразу входящей функции. Хотя функция ArrowFunction может содержать ссылки на super, функциональный объект, созданный на шаге 4, не превращается в метод, выполняя MakeMethod . Функция ArrowFunction , которая ссылается на super, всегда содержится внутри функции [ Arrow [], а необходимое для реализации super доступное через область который захватывается функциональным объектом ArrowFunction .
  • Они неконструкторы. Это означает, что у них нет внутреннего метода [[Construct]] и, следовательно, он не может быть создан, например.
    var f = a => a;
    f(123);  // 123
    new f(); // TypeError: f is not a constructor
    

47
задан laike9m 18 December 2015 в 11:03
поделиться

5 ответов

Как описано в документации BeutifulSoup

Вы можете использовать это:

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

EDIT:

Чтобы вернуть теги которые имеют только атрибут valign = "top", вы можете проверить длину свойства tag attrs:

from BeautifulSoup import BeautifulSoup

html = '<td valign="top">.....</td>\
        <td width="580" valign="top">.......</td>\
        <td>.....</td>'

soup = BeautifulSoup(html)
results = soup.findAll("td", {"valign" : "top"})

for result in results :
    if len(result.attrs) == 1 :
        print result

Это возвращает:

<td valign="top">.....</td>
63
ответ дан Loïc G. 18 August 2018 в 10:58
поделиться
  • 1
    В соответствии с моим комментарием julio.alegria, это найдет все теги <tr> с атрибутом valign="top", в том числе с другими атрибутами (<td width="580" valign="top"> также возвращается в этом поиске). Я ищу способ найти <tr>, единственным атрибутом которого является valign="top" – Snaxib 20 January 2012 в 00:37
  • 2
    Итак, вы можете проверить len (tag.attrs). Если len (tag.attrs) & gt; 1, игнорировать тег (я отредактировал мой пост) – Loïc G. 20 January 2012 в 00:52
  • 3
    Удивительно, спасибо человеку! – Snaxib 20 January 2012 в 01:43

, если вы хотите искать только имя атрибута с любым значением

from bs4 import BeautifulSoup
import re

soup= BeautifulSoup(html.text,'lxml')
results = soup.findAll("td", {"valign" : re.compile(r".*")})
8
ответ дан Amr 18 August 2018 в 10:58
поделиться
  • 1
    Вам не хватает скобки после r".*", в результате чего это не компилируется. – Jack Cole 20 December 2017 в 20:02

Самый простой способ сделать это - использовать новый метод CSS select:

soup = BeautifulSoup(html)
results = soup.select('td[valign="top"]')
5
ответ дан Chris Redford 18 August 2018 в 10:58
поделиться
  • 1
    также тот, который работает с новейшей версией. – Ben Mathews 18 February 2018 в 06:49
  • 2
    Работает ли он для атрибута, содержащего пробелы? – Khanh Hua 3 July 2018 в 13:26

Вы можете использовать функции lambda в findAll, как описано в документации . Чтобы в вашем случае искать тэг td только с valign = "top", используйте следующее:

td_tag_list = soup.findAll(
                lambda tag:tag.name == "td" and
                len(tag.attrs) == 1 and
                tag["valign"] == "top")
30
ответ дан Grijesh Chauhan 18 August 2018 в 10:58
поделиться
  • 1
    лучший ответ, поскольку он использует полную мощность BS – Rafael T 30 October 2014 в 05:21
  • 2
    Отличный ответ, потому что он дает вам результат очень оптимизированным образом. – CrazyGeek 7 January 2015 в 13:24

Просто передайте его как аргумент findAll:

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("""
... <html>
... <head><title>My Title!</title></head>
... <body><table>
... <tr><td>First!</td>
... <td valign="top">Second!</td></tr>
... </table></body><html>
... """)
>>>
>>> soup.findAll('td')
[<td>First!</td>, <td valign="top">Second!</td>]
>>>
>>> soup.findAll('td', valign='top')
[<td valign="top">Second!</td>]
2
ответ дан juliomalegria 18 August 2018 в 10:58
поделиться
  • 1
    Что делать, если есть такие метки: <td width="580" valign="top">? Я не хочу их захватывать, только теги, единственным атрибутом которых является valign="top" – Snaxib 20 January 2012 в 00:27
Другие вопросы по тегам:

Похожие вопросы: