Ответ 1
С незначительными изменениями он работает.
soup.findAll('meta', attrs={'name':re.compile("^description$", re.I)})
Я пытаюсь извлечь Meta Description для выбранных веб-страниц. Но здесь я столкнулся с проблемой чувствительности к регистру BeautifulSoup.
Как некоторые страницы имеют <meta name="Description
, а некоторые имеют <meta name="Description
.
Моя проблема очень похожа на проблему qaru.site/info/299240/...
Единственное различие заключается в том, что я не могу использовать lxml.. Я должен придерживаться Beautifulsoup.
С незначительными изменениями он работает.
soup.findAll('meta', attrs={'name':re.compile("^description$", re.I)})
Вы можете дать BeautifulSoup регулярное выражение для сопоставления атрибутов. Что-то вроде
soup.findAll('meta', name=re.compile("^description$", re.I))
может сделать трюк. Cribbed from документы BeautifulSoup.
Регулярное выражение? Теперь у нас еще одна проблема.
Вместо этого вы можете перейти в лямбда:
soup.findAll(lambda tag: tag.name.lower()=='meta',
name=lambda x: x and x.lower()=='description')
(x and
исключает исключение, если атрибут name
не определен для тега)
С помощью bs4 используйте следующее:
soup.find('meta', attrs={'name': lambda x: x and x.lower()=='description'})
Еще лучше использовать селектор attribute = value css с аргументом i
для нечувствительности к регистру
soup.select('meta[name="description" i]')
изменить регистр источника HTML-страницы. Используйте такие функции, как string.lower(), string.upper()