Как использовать Python и BeautifulSoup для разбора классов - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь проанализировать только независимые утверждения google.com/patents, но они используют то же имя класса, что и дочерние зависимые утверждения. Я новичок, но думаю, что я пытаюсь спросить, как исключить дочерние результаты, если у родителя есть определенное имя класса.

Я пытался работать с примерами parent / child / sibling / etc . это руководство по BeautifulSoup.

К сожалению, ничего не получалось.


from bs4 import BeautifulSoup
import requests

url = 'https://patents.google.com/patent/US7054130?oq=US7654309'

response = requests.get(url)

data = response.text
soup = BeautifulSoup(data, 'html.parser')


claims = soup.find_all('div', class_='claim')

for claim in claims:

    if claim.find(class_='claim-dependent style-scope patent-text'):
        continue
    print(claim.text)

Я ожидал, что разделы зависимых претензий будут пропущены и напечатаны только независимые претензии.

Результаты - Все претензии, независимые и зависимые, печатаются.

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Просто отфильтруйте родительские и дочерние классы, я думаю, поскольку это исключает утверждения с родительским классом claim-dependent, которые, как я предполагаю, являются зависимыми.

print(soup.select('.claim .claim')

3 совпадения (утверждения 1,6,19)


Вы можете увидеть один из каждого типа здесь:

enter image description here

Это для претензий 1 и 2. Верх, претензия1, имеет родительский div с классом claim и дочерний элемент с классом claim, тогда как нижний элемент по п.2 имеет родительский div с классом claim-dependant, а затем дочерний элемент с классом claim.Таким образом, вы указываете это отношение родительского класса и дочернего класса к фильтру.


from bs4 import BeautifulSoup
import requests

url = 'https://patents.google.com/patent/US7054130?oq=US7654309'
response = requests.get(url)
data = response.text
soup = BeautifulSoup(data, 'html.parser')
data = [claim.text for claim in soup.select('.claim .claim')]
print(data)
0 голосов
/ 21 июня 2019

Ваш оператор if ничего не делает, потому что он содержит только continue (и, кстати, результат пуст), поэтому вы печатаете все заявки в следующей строке.

Вы можете отфильтровать все заявки с помощью зависимого тега claim-ref:

from bs4 import BeautifulSoup
import requests

url = 'https://patents.google.com/patent/US7054130?oq=US7654309'

response = requests.get(url)

data = response.text
soup = BeautifulSoup(data, 'html.parser')


claims = soup.find_all('div', class_='claim')

for claim in claims:
    if not claim.find('claim-ref'):
        print(claim.find(class_='claim'))
...