В BeautifulSoup, как мне искать элемент в другом элементе? - PullRequest
0 голосов
/ 03 марта 2020

Я использую Django 2, Python 3.7 и BeautifulSoup 4. У меня есть следующий код, который должен найти элемент внутри элемента ...

req = urllib2.Request(fullurl, headers=settings.HDR)
html = urllib2.urlopen(req, timeout=settings.SOCKET_TIMEOUT_IN_SECONDS).read()
bs = BeautifulSoup(html, features="lxml")
pattern = re.compile(r'^submitted ')
posted_elt = bs.find(text=pattern)
author_elt = posted_elt.find("span", class_="author") if posted_elt is not None else None

Однако строка

author_elt = posted_elt.find("span", class_="author") if posted_elt is not None else None

выдает ошибку «TypeError: find () не принимает аргументов ключевого слова». Как правильно искать элемент в другом элементе?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

При поиске текста в BeautifulSoup вы получаете объект bs4.element.NavigableString, который очень похож на обычный python str. К счастью, в нем есть та «навигационная» часть. navigableString.parent ссылается на родительский элемент, который можно использовать в следующей находке. Вы не пытаетесь найти <span> дочерний элемент текстового узла, поскольку текстовые узлы не имеют дочерних элементов. Вы пытаетесь найти элемент с этим текстовым узлом и продолжаете поиск оттуда.

req = urllib2.Request(fullurl, headers=settings.HDR)
html = urllib2.urlopen(req, timeout=settings.SOCKET_TIMEOUT_IN_SECONDS).read()
bs = BeautifulSoup(html, features="lxml")
pattern = re.compile(r'^submitted ')
posted_elt = bs.find(text=pattern)
author_elt = posted_elt.parent.find("span", class_="author") if posted_elt is not None else None
0 голосов
/ 03 марта 2020

Метод .find() ищет теги html. Когда тег найден, вы должны преобразовать результат в строку, используя атрибут .text из .find() results. Затем используйте поиск по регулярному выражению в этой строке.

Вот пример использования:

from bs4 import BeautifulSoup
import requests
import re

res = requests.get("https://en.wikipedia.org/wiki/Dog")
soup = BeautifulSoup(res.content,"html.parser")
reg = re.compile("-")
s = soup.find("title").text
print(re.search(reg,s).group(0))

# If you want to find all html tags and search each of them use find_all()

all_res = soup.find_all("p")
reg = re.compile("dog")
for i in all_res:
    s = i.text
    match = re.search(reg,s)
    if match:
        print(match.group(0))

В следующем примере все теги <p> будут преобразованы в строку и найдены слова "собака" в их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...