как выбрать второй код из кода без какой-либо идентификации? - PullRequest
0 голосов
/ 11 октября 2019

Я не могу понять, что мне нужно сделать, чтобы получить второй div внутри второго div с помощью bs4. Мне нужно получить div с датой. Спасибо за помощь.

вот код:

<div class="featured-item-meta">
    <div><strong>Published:</strong></div>
    <div>October 14, 2015</div>
    <ul class="creatorList">
        <li>
            <div><strong>Writer:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/10329/g_willow_wilson">G. Willow Wilson</a>, <a href="https://www.marvel.com/comics/creators/12441/marguerite_bennett">Marguerite  Bennett</a></div>
        </li>
        <li>
            <div><strong>Cover Artist:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/8825/jorge_molina">Jorge  Molina</a></div>
        </li>
    </ul>
</div>

Ответы [ 5 ]

1 голос
/ 11 октября 2019

Это легко с BS4 4.7.1 +. Вы можете использовать :has и :contains, чтобы получить родителя div, у которого есть дочерний элемент strong, который содержит строку Published:, а затем использовать соседний братский комбинатор, чтобы получить следующий div.

from bs4 import BeautifulSoup

html = '''
<div class="featured-item-meta">
    <div><strong>Published:</strong></div>
    <div>October 14, 2015</div>
    <ul class="creatorList">
        <li>
            <div><strong>Writer:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/10329/g_willow_wilson">G. Willow Wilson</a>, <a href="https://www.marvel.com/comics/creators/12441/marguerite_bennett">Marguerite  Bennett</a></div>
        </li>
        <li>
            <div><strong>Cover Artist:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/8825/jorge_molina">Jorge  Molina</a></div>
        </li>
    </ul>
</div>
'''
soup = bs(html, 'lxml')
print(soup.select_one('div:has(strong:contains("Published:")) + div').text)
0 голосов
/ 11 октября 2019

Ну, было бы неплохо увидеть, как запрашивать эту веб-страницу. Я предполагаю, что у Вас есть свой собственный путь, и он помечает его как page_text для строкового формата. В любом случае для идеи Вы можете написать селектор так:

import bs4
page_text = """<div class="featured-item-meta">
         <div>
           <strong>Published:</strong>
         </div>
         <div>October 14, 2015</div>
         <ul class="creatorList">
             <li><div><strong>Writer:</strong></div>
                 <div><a href="https://www.marvel.com/comics/creators/10329 /g_willow_wilson">G. Willow Wilson</a>, <a href="https://www.marvel.com/comics/creators/12441/marguerite_bennett">Marguerite  Bennett</a></div></li>
             <li><div><strong>Cover Artist:</strong></div>
                 <div><a href="https://www.marvel.com/comics/creators/8825/jorge_molina">Jorge  Molina</a></div></li>
        </ul>
       </div>"""

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

date_without_div = soup.select('div > div')[1].get_text(strip=True)
#Or
date_with_div = soup.select('div > div')[1]

print(date_without_div)
print(date_with_div)

Вывод

'October 14, 2015'
<div>October 14, 2015</div>
0 голосов
/ 11 октября 2019
from  bs4 import BeautifulSoup as bsp
s = '''
<div class="featured-item-meta">
    <div><strong>Published:</strong></div>
    <div>October 14, 2015</div>
    <ul class="creatorList">
        <li>
            <div><strong>Writer:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/10329/g_willow_wilson">G. Willow Wilson</a>, <a href="https://www.marvel.com/comics/creators/12441/marguerite_bennett">Marguerite  Bennett</a></div>
        </li>
        <li>
            <div><strong>Cover Artist:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/8825/jorge_molina">Jorge  Molina</a></div>
        </li>
    </ul>
</div>
'''
print(bsp(s).find('div').findChildren('div')[1])
  • код может незначительно меняться в зависимости от вашей полной веб-страницы и ее структуры.
0 голосов
/ 11 октября 2019

Захватите текст Published: и затем используйте find_next('div'), чтобы получить дату.

from bs4 import BeautifulSoup
html='''<div class="featured-item-meta">
    <div><strong>Published:</strong></div>
    <div>October 14, 2015</div>
    <ul class="creatorList">
        <li>
            <div><strong>Writer:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/10329/g_willow_wilson">G. Willow Wilson</a>, <a href="https://www.marvel.com/comics/creators/12441/marguerite_bennett">Marguerite  Bennett</a></div>
        </li>
        <li>
            <div><strong>Cover Artist:</strong></div>
            <div><a href="https://www.marvel.com/comics/creators/8825/jorge_molina">Jorge  Molina</a></div>
        </li>
    </ul>
</div>'''

soup=BeautifulSoup(html,'html.parser')
datetext=soup.find('div' , text='Published:').find_next('div').text
print(datetext)

Вывод :

October 14, 2015
0 голосов
/ 11 октября 2019

Вот обходной путь

text = '<div class="featured-item-meta">\
<div><strong>Published:</strong></div>\
<div>October 14, 2015</div>\
<ul class="creatorList">\
    <li>\
        <div><strong>Writer:</strong></div>\
        <div><a href="https://www.marvel.com/comics/creators/10329/g_willow_wilson">G. Willow Wilson</a>, <a href="https://www.marvel.com/comics/creators/12441/marguerite_bennett">Marguerite  Bennett</a></div>\
    </li>\
    <li>\
        <div><strong>Cover Artist:</strong></div>\
        <div><a href="https://www.marvel.com/comics/creators/8825/jorge_molina">Jorge  Molina</a></div>\
    </li>\
</ul>\
</div>'

soap = BeautifulSoup(text,'html.parser')

print(soap.find('div',attrs={'class':'featured-item-meta'})\
          .find_all('div')[1].text)

Вывод:

October 14, 2015

Документация о bs4 здесь

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