Найти подстроку ключевого слова с помощью BeautifulSoup - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь найти URL-адрес, содержащий строку / подстроку в теге <td>, из списка URL-адресов, используя BeautifulSoup.Он отлично работает, если присутствует полная строка, но не работает для подстроки.Это код, который я написал до сих пор:

for url in urls:
    r = requests.get(url, allow_redirects=False)
    soup = BeautifulSoup(r.content, 'lxml')
    words = soup.find_all("td", text=the_word)
    print(words)
    print(url)

Я не знаю много.Кто-нибудь может направить меня на поиск подстрок тоже?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы можете использовать пользовательскую функцию , чтобы проверить, присутствует ли в тексте слово .

html = '''
<td>the keyword is present in the text</td>
<td>the keyword</td>
<td></td>
<td>the word is not present in the text</td>'''

soup = BeautifulSoup(html, 'lxml')
the_word = 'keyword'
tags = soup.find_all('td', text=lambda t: t and the_word in t)
print(tags)
# [<td>the keyword is present in the text</td>, <td>the keyword</td>]

Обычно будет работать только the_word in t.Но если есть какие-либо теги <td>, у которых нет текста, как показано в примере (<td></td>), использование the_word in t вызовет TypeError: argument of type 'NoneType' is not iterable.Вот почему мы сначала должны проверить, не является ли текст None.Следовательно, функция lambda t: t and the_word in t.


Если вам не удобны lambda s, вы можете использовать простую функцию, эквивалентную приведенной выше:

def contains_word(t):
    return t and 'keyword' in t

tags = soup.find_all('td', text=contains_word)
0 голосов
/ 20 мая 2018

Нет способа сделать это напрямую.Единственный способ, которым я могу придумать, - это поместить весь текст из тегов 'td' в структуру данных, такую ​​как список или словарь, и протестировать ее там.

...