Python, Scrapy — Извлеките herf с помощью xpath или css

#python #xpath #scrapy

Вопрос:

Это источник страницы (результат поиска Google, Chrome)

 <div class="yuRUbf">
<a href="https://www.apple.com/my/iphone/compare/" data-ved="2ahUKEwitnOWgoMHxAhUdxIsBHVDpCmIQFjALegQIAxAD" ping="/url?sa=tamp;amp;source=webamp;amp;rct=jamp;amp;url=https://www.apple.com/my/iphone/compare/amp;amp;ved=2ahUKEwitnOWgoMHxAhUdxIsBHVDpCmIQFjALegQIAxAD">
    <br>
        <h3 class="LC20lb DKV0Md">iPhone - Compare Models - Apple (MY)</h3><div class="TbwUpd NJjxre"><cite class="iUh30 Zu0yb qLRx3b tjvcx">https: //www.apple.com<span class="dyjrff qzEoUe"> › iphone › compare</span></cite></div></a><div class="B6fmyf"><div class="TbwUpd"><cite class="iUh30 Zu0yb qLRx3b tjvcx">https://www.apple.com<span class="dyjrff qzEoUe"> › iphone › compare</span></cite></div><div class="eFM0qc"><span><div jscontroller="hiU8Ie" class="action-menu"><a class="GHDvEf" href="#" aria-label="Result options" aria-expanded="false" aria-haspopup="true" role="button" jsaction="PZcoEd;keydown:wU6FVd;keypress:uWmNaf" data-ved="2ahUKEwitnOWgoMHxAhUdxIsBHVDpCmIQ7B0wC3oECAMQBg"><span class="gTl8xb"></span></a><ol class="action-menu-panel zsYMMe" role="menu" tabindex="-1" jsaction="keydown:Xiq7wd;mouseover:pKPowd;mouseout:O9bKS" data-ved="2ahUKEwitnOWgoMHxAhUdxIsBHVDpCmIQqR8wC3oECAMQBw"><li class="action-menu-item OhScic zsYMMe" role="menuitem"><a class="fl" href="https://webcache.googleusercontent.com/search?q=cache:6zhDHqY_aM4J:https://www.apple.com/my/iphone/compare/ amp;amp;cd=12amp;amp;hl=enamp;amp;ct=clnkamp;amp;gl=kr" ping="/url?sa=tamp;amp;source=webamp;amp;rct=jamp;amp;url=https://webcache.googleusercontent.com/search?q=cache:6zhDHqY_aM4J:https://www.apple.com/my/iphone/compare/+&cd=12&hl=en&ct=c
 

Это функция синтаксического анализа, я использую xpath для извлечения элементов,которые мне нужны (заголовки, ссылки).

     def parse(self, response):
    titles = response.xpath('//*[@id="main"]/div/div/div/a/h3/div//text()').extract()
    links = response.xpath('//*[@id="main"]/div/div/div/a/@href').extract()

    items = []

    for idx in range(len(titles)):
        item = GoogleScraperItem()
        item['title'] = titles[idx]
        item['link'] = links[idx].lstrip("/url?q=")
        print('titles', titles)
        print('links', links)

        items.append(item)
        df = pd.DataFrame(items, columns=['title', 'link'])
        writer = pd.ExcelWriter('test6.xlsx', engine='xlsxwriter')
        df.to_excel(writer, sheet_name='test6.xlsx')
        writer.save()
    return items
 

выход

‘link’:https://www.apple.com/my/iphone/compare/amp;sa=Uamp;ved=2ahUKEwjB74yUrsHxAhXInGoFHeKADSAQFjAAegQIBxABamp;usg=AOvVaw1Wgg_RVEQfHS30tbhmlwzv’,

‘название’: ‘iPhone — Сравните модели — Apple (МОЙ)’

..пропустить..

Проблема

Получает ненужную строку ССЫЛКИ.На самом деле, если вы откроете его в Chrome, страница не откроется нормально.

Рабочая ссылка : https://www.apple.com/my/iphone/compare/

Вопрос

Чтобы извлечь «Рабочую ссылку» с помощью xpath или css?

Ответ №1:

Одним из решений может быть последующая обработка ссылки . Используйте разделитель параметров»amp;», чтобы удалить параметры .

 link=link.split('amp;')[0]
 

Итак , скажите, что вы хотите :

 def parse(self, response):
    titles = response.xpath('//*[@id="main"]/div/div/div/a/h3/div//text()').extract()
    links = response.xpath('//*[@id="main"]/div/div/div/a/@href').extract()

    items = []

    for idx in range(len(titles)):
        item = GoogleScraperItem()
        item['title'] = titles[idx]
        item['link'] = links[idx].lstrip("/url?q=")
        #Inserted here 
        item['link'] = item['link].split('amp;')[0]
    print('titles', titles)
    print('links', links)

    items.append(item)
    df = pd.DataFrame(items, columns=['title', 'link'])
    writer = pd.ExcelWriter('test6.xlsx', engine='xlsxwriter')
    df.to_excel(writer, sheet_name='test6.xlsx')
    writer.save()
return items
 

Комментарии:

1. Спасибо. Я уже комментировал выше ответ, мой окончательный URL-адрес будет иметь amp;start={pageNum}’, так что, если я использую link=link.split(‘amp;’)[0], то я не смогу использовать свой URL. Я прав?

2. Вы можете изменить его немного дальше . Скажем , если вы знаете, что первый параметр будет начальным параметром, вы можете использовать что-то вроде : 1. ссылка=ссылка.split (‘amp;’) — > даст массив с URL-адресом в 0-м индексе, за которым последуют остальные параметры . 2. ссылка=ссылка[0] ‘amp;’ ссылка[1] это даст ответ в виде url/amp;sa =U