Как пройти через класс div, чтобы получить доступ к классу li внутри? - PullRequest
2 голосов
/ 18 апреля 2019

Я перебираю страницу и обнаружил, что с моими методами xpath и regex я не могу получить набор значений, которые находятся внутри класса div

Я пробовал метод, изложенный здесь на этой странице Как получить все теги li в теге div а затем текущая логика, показанная ниже, в моем файле

    #PRODUCT ATTRIBUTES (STYLE, SKU, BRAND)     need to figure out how to loop thru a class and pull out the 2 list tags
prodattr = re.compile(r'<div class=\"pdp-desc-attr spec-prod-attr\">([^<]+)</div>', re.IGNORECASE)
prodattrmatches = re.findall(prodattr, html)
for m in prodattrmatches:
        m = re.compile(r'<li class=\"last last-item\">([^<]+)</li>', re.IGNORECASE)
        stymatches = re.findall(m, html)

#STYLE
sty = re.compile(r'<li class=\"last last-item\">([^<]+)</li>', re.IGNORECASE)
stymatches = re.findall(sty, html)

#BRAND
brd = re.compile(r'<li class=\"first first-item\">([^<]+)</li>', re.IGNORECASE)   
brdmatches = re.findall(brd, html)

Выше приведен текущий код, который НЕ работает .. все возвращается пустым. В целях моего тестирования я просто записываю данные, если таковые имеются, в команду печати, чтобы я мог видеть их на консоли ..

    itmDetails2 = dets['sku'] +","+ dets['description']+","+ dets['price']+","+ dets['brand']

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

SKUE GOES HERE,adidas Women's Essentials Tricot Track Jacket,34.97, BRAND GOES HERE

<div class="pdp-desc-attr spec-prod-attr">
    <ul class="prod-attr-list">
        <li class="first first-item">Brand: adidas</li>
        <li>Country of Origin: Imported</li>
        <li class="last last-item">Style: F18AAW400D</li>   
    </ul>
</div>

Ответы [ 2 ]

3 голосов
/ 18 апреля 2019

Не использовать Regex для разбора HTML

Есть лучшие и безопасные способы сделать это.

Взгляните на этот код, используя Parsel и BeautifulSoup , чтобы извлечь теги li вашего примера кода:

from parsel import Selector
from bs4 import BeautifulSoup

html = ('<div class="pdp-desc-attr spec-prod-attr">'
           '<ul class="prod-attr-list">'
             '<li class="first first-item">Brand: adidas</li>'
             '<li>Country of Origin: Imported</li>'
             '<li class="last last-item">Style: F18AAW400D</li>'
           '</ul>'
         '</div>')

# Using parsel
sel = Selector(text=html)

for li in sel.xpath('//li'):
    print(li.xpath('./text()').get())

# Using BeautifulSoup
soup = BeautifulSoup(html, "html.parser")

for li in soup.find_all('li'):
    print(li.text)

Выход:

Brand: adidas
Country of Origin: Imported
Style: F18AAW400D
Brand: adidas
Country of Origin: Imported
Style: F18AAW400D
1 голос
/ 19 апреля 2019

Я бы использовал html-парсер и искал класс ul. Использование bs4 4.7.1

from bs4 import BeautifulSoup as bs

html = '''
<div class="pdp-desc-attr spec-prod-attr">
    <ul class="prod-attr-list">
        <li class="first first-item">Brand: adidas</li>
        <li>Country of Origin: Imported</li>
        <li class="last last-item">Style: F18AAW400D</li>   
    </ul>
</div>
'''

soup = bs(html, 'lxml')

for item in soup.select('.prod-attr-list:has(> li)'):
    print([sub_item.text for sub_item in item.select('li')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...