Получить текст с кавычками внутри одного тега, используя BeautifulSoup - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь разобрать веб-страницу с помощью BeautifulSoup.

Дело 1:

<div class="a">
    <div class="b">abc def</div>
    <div class="c">123 456</div>
</div>

Случай 2:

<div class="a">
    <div class="b">
        "abc "
        "def"
    </div>
    <div class="c">123 456</div>
</div>

Я хочу получить текст из класса C, используя код:

c = soup.find('div', class = 'b', text = 'abc def').next_sibling.text

В случае 1 это работает хорошо. Но в случае 2 это не работает. Для случая 2 я попытался также:

c = soup.find('div', class = 'b', text = '"abc ""def"').next_sibling.text

В обоих случаях

soup.find('div', class = 'b').text 

дает мне то же значение:

abc def

Как правильно работать с Case 2?

[РЕДАКТИРОВАТЬ # 1]

Мне нужно сделать это, потому что есть несколько div с одним и тем же классом:

<div class="a">
    <div class="b">abc def1</div>
    <div class="c">123</div>
</div>
<div class="a">
    <div class="b">abc def2</div>
    <div class="c">456</div>
</div>
<div class="a">
    <div class="b">
        "abc "
        "def3"
    </div>
    <div class="c">789</div>
</div>

[РЕДАКТИРОВАТЬ # 2]

Я попытался сохранить response.text в файл и увидел, что это выглядит так:

    <div class="b">abc <!-- -->def3</div>

Но в Chrome это выглядит так:

    <div class="b">
        "abc "
        "def3"
    </div>

Кроме того, я не могу получить текст через re.compile, если текст внутри тега имеет вид:

    <div class="b">abc m<sup>2</sup></div>

1 Ответ

1 голос
/ 15 марта 2019

Вы можете найти следующий элемент с именем тега, а затем распечатать значение.Вы можете использовать re модуль для поиска текста.Здесь у вас есть два примера.

Пример 1:

import bs4
htmldoc='''<html><div class="a">
    <div class="b">
        "abc "
        "def"
    </div>
    <div class="c">123 456</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')
c = soup.find('div', class_='b').findNext('div').contents[0]
print(c) 

вывод:

123 456

Пример 2:

import bs4
import re

htmldoc='''<html><div class="a">
    <div class="b">
        "abc "
        "def"
    </div>
    <div class="c">123 456</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')

d = soup.find('div', text=re.compile('def')).findNext('div').contents[0]
print(d)

вывод:

123 456

Пример 3:

import bs4

htmldoc='''<html><div class="a">
    <div class="b">abc def1</div>
    <div class="c">123</div>
</div>
<div class="a">
    <div class="b">abc def2</div>
    <div class="c">456</div>
</div>
<div class="a">
    <div class="b">
        "abc "
        "def3"
    </div>
    <div class="c">789</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')

c = soup.find_all('div', class_='b')
for d in c:
   text=d.findNext('div').contents[0]
   print(text)

Выход:

123
456
789

Пример 4:

import bs4

htmldoc='''<html><div class="a">
    <div class="b">abc def1</div>
    <div class="c">123</div>
</div>
<div class="a">
    <div class="b">abc def2</div>
    <div class="c">456</div>
</div>
<div class="a">
    <div class="b">
        "abc "
        "def3"
    </div>
    <div class="c">789</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')
d=soup.find(lambda tag:tag.name=="div" and "abc " in tag.text and  "def3" in tag.text).findNext('div').findNext('div').contents[0]

print(d)

вывод:

789

Пример 5:

import bs4

htmldoc='''<html><div class="a">
    <div class="b">abc def1</div>
    <div class="c">123</div>
</div>
<div class="a">
    <div class="b">abc def2</div>
    <div class="c">456</div>
</div>
<div class="a">
    <div class="b">
        "abc "
        "def3"
    </div>
    <div class="c">789</div>
</div></html>'''

soup = bs4.BeautifulSoup(htmldoc, 'html.parser')

c = soup.find_all('div', class_='b')
for d in c:
   if (('abc ' in d.text) and ('def3' in d.text)):
     textc=d.findNext('div').contents[0]
     print(textc)

Надеюсь, это поможет.

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