Search code examples
python-3.xbeautifulsouphtml-parsing

Parsing precise answers of HTML with redundant tag


I'm looking to parse the FAQ of the Bert as a service.

I'm interested by this HTML :

<h5>
    <a id="user-content-q-how-do-you-get-the-fixed-representation-did-you-do-pooling-or-something" class="anchor" aria-hidden="true" href="#q-how-do-you-get-the-fixed-representation-did-you-do-pooling-or-something">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
        <path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45">
        </path>
    </svg>
    </a>
    <strong>Q:</strong> How do you get the fixed representation? Did you do pooling or something?
</h5>
<p><strong>A:</strong> Yes, pooling is required to get a fixed representation of a sentence. In the default strategy <code>REDUCE_MEAN</code>, I take the second-to-last hidden layer of all of the tokens in the sentence and do average pooling.</p>

I have succeed to retrieve the questions separately of the answers. But the form of tag of the answers are not redundant. Here is my code to parse this HTML :

import requests
from bs4 import BeautifulSoup  

wp = requests.get("https://github.com/hanxiao/bert-as-service")
soup = BeautifulSoup(wp.text, "html.parser")

# Parse the questions    
results = soup.find_all("h5") 

questions = []
for result in results:
    question = result.contents[2]
    questions.append(question)

# Parse the answers
new_tag = soup.find_all("p")
new_tag = new_tag[114:165] # specify the tag of the answers


answers = []
for new in new_tag:
    answer = new.contents[1]

I have really bad forms for my answer as the <p> tag is really frequent.


Solution

  • If you run

    for i in results:
      print(i.text)
      print(i.findNext('p').text)
    

    You get (picking one q/a pair at random):

    Q: Can I use multilingual BERT model provided by Google?
    A: Yes.
    

    You can then append these to your lists and go from there.