Не могу найти комбинацию ключевых слов на странице XML, используя Python и красивый суп - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу найти тэг, в котором присутствуют два ключевых слова. Например, я хочу найти тэг, который содержит вхождение 'Yankee' AND 'duck'.Код ниже:

        elif len(keywords) == 2:
            keyword1 = keywords[0]
            keyword2 = keywords[1]

            print("Searching for product...")
            keywordLinkFound = False
            while keywordLinkFound is False:
                html = self.driver.page_source
                soup = BeautifulSoup(html, 'lxml')
                try:
                    keywordLink = soup.find('loc', text=re.compile(keyword1 + keyword2)).text
                    return keywordLink
                except AttributeError:
                    print("Product not found on site, retrying...")
                    time.sleep(monitorDelay)
                    self.driver.refresh()
                break

А вот XML, который я пытаюсь получить:

<url>
<loc>
  https://packershoes.com/products/copy-of-382-new-balance-m999jtc-1
</loc>
<lastmod>2018-12-04T21:49:25-05:00</lastmod>
<changefreq>daily</changefreq>
<image:image>
<image:loc>
  https://cdn.shopify.com/s/files/1/0208/5268/products/NB999JTC-2_4391df07-a3a2-4c82-87b3-49d776096473.jpg?v=1543851653
</image:loc>
  <image:title>NEW BALANCE M999JTC "MADE IN USA"</image:title>
</image:image>
</url>
<url>
<loc>
  https://packershoes.com/products/copy-of-382-packer-x-new-era-new-york-yankee-duck-canvas-1
</loc>
<lastmod>2018-12-06T14:39:37-05:00</lastmod>
<changefreq>daily</changefreq>
<image:image>
<image:title>
  NEW ERA JAPAN 59FIFTY NEW YORK YANKEES "DUCK CANVAS"
</image:title>
</image:image>
</url>

1 Ответ

0 голосов
/ 11 декабря 2018

keyword1 + keyword2 - это строка yankeeduck, поэтому вы ищете эту строку, и она не будет совпадать, если два слова не связаны таким образом.Вам нужно разрешить что-либо между ними, а также распознать их в обратном порядке.Таким образом, регулярное выражение должно быть:

yankee.*duck|duck.*yankee

Следовательно, код должен быть:

regexp = "%s.*%s|%s.%s"%(keyword1, keyword2, keyword2, keyword1)
keywordLink = soup.find('loc', text=re.compile(regexp)).text

И в случае, если ключевые слова содержат символы, которые являются специальными в регулярном выражении, вы должны избегать их:

keyword1 = re.escape(keywords[0])
keyword2 = re.escape(keywords[1])
...