Красивый суп, пересечение двух списков (один с парами строк) - PullRequest
0 голосов
/ 22 апреля 2020

Я использую BeautifulSoup, чтобы удалить несколько URL.

BeautifulSoup возвращает список результатов, который выглядит следующим образом:

list1 = ['url1','keyword1', 'url2', 'keyword2'...] (пары ключевых слов и URL-адреса, откуда они берутся) )

Я хочу сопоставить list1 с list2, списком ключевых слов.

Моя цель состоит в том, чтобы, если keyword_referenceX из list2 присутствует в list1 в результате я получаю ['urlX', keyword_referenceX'].

import requests
from bs4 import BeautifulSoup

urls = []
list1 = []
results = []

urls = ['url1','url2']

list2  = ['keyword_reference1', 'keyword_reference2']

for url in urls:
    req = requests.get(url)
    soup = BeautifulSoup(req.text, "lxml")

    for sub_heading in soup.find_all('h3'): 
        if  str(1) + ". " in sub_heading.text and "11." not in sub_heading.text: #filter I apply  
            list1.append(url)
            list1.append(sub_heading.text)

for list2_element in list2:
    for list1_element in list1:
        if list2_element in list1_element:
            results.append(list2_element)


print(results)

1 Ответ

0 голосов
/ 22 апреля 2020
import requests
from bs4 import BeautifulSoup
from collections import defaultdict

urls = []
list1 = defaultdict(list)
results = []

urls = ['url1','url2']

list2  = ['keyword_reference1', 'keyword_reference2']

for url in urls:
    req = requests.get(url)
    soup = BeautifulSoup(req.text, "lxml")

    for sub_heading in soup.find_all('h3'): 
        if  str(1) + ". " in sub_heading.text and "11." not in sub_heading.text: 
            # list1 is actually a defaultdict
            list1[url].append(sub_heading.text)

for list2_element in list2:
    for k, v in list1.items():
      # Here v is the list containing sub_heading.text and k is the url
      if list2_element in v:
        results.extend([url, list2_element])


print(results)
...