trafilatura icon indicating copy to clipboard operation
trafilatura copied to clipboard

Extract text from buttons for semantic elements

Open zirkelc opened this issue 10 months ago • 1 comments

Hi,

I hope I'm not flooding you with too many issues 😄

I have an FAQ page that uses <button /> to show and hide the corresponding content. It looks roughly like this:

<div class="faq__item" itemscope="" itemprop="mainEntity" itemtype="https://schema.org/Question">
	<button is="toggle-button" class="collapsible-toggle text--strong"
		aria-controls="block-template--18681112592652__faq-18db33c8-b7be-456f-b5b4-8c935376f225" aria-expanded="true"
		itemprop="name">1. Question: Dolor sit amet<span class="animated-plus"></span>
	</button>

	<collapsible-content id="block-template--18681112592652__faq-18db33c8-b7be-456f-b5b4-8c935376f225"
		class="collapsible anchor" itemscope="" itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"
		style="overflow: visible;" open="">
		<div class="collapsible__content text-container" itemprop="text">
			<p>1. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
				labore et dolore magna aliqua</p>
		</div>
	</collapsible-content>
</div>

The <button /> contains the question and the <collapsible-content/> contains the answer. However, when I extract the content, the text from the button is not extracted. This usually makes sense because buttons are not really semantic elements, but in this case the buttons contains valuable information.

Here's the full example faq.html:

<div class="faq">
	<div class="faq-navigation hidden-pocket">

	</div>
	<div class="faq__wrapper" itemscope="" itemtype="https://schema.org/FAQPage">
		<h2 id="category-template--18681112592652__faq-6c8e6357-90c2-4ba6-8bbb-95ce71242bae"
			class="faq__category heading h6 anchor">FAQs</h2>
		<div class="faq__item" itemscope="" itemprop="mainEntity" itemtype="https://schema.org/Question">
			<button is="toggle-button" class="collapsible-toggle text--strong"
				aria-controls="block-template--18681112592652__faq-18db33c8-b7be-456f-b5b4-8c935376f225" aria-expanded="true"
				itemprop="name">1. Question: Dolor sit amet<span class="animated-plus"></span>
			</button>

			<collapsible-content id="block-template--18681112592652__faq-18db33c8-b7be-456f-b5b4-8c935376f225"
				class="collapsible anchor" itemscope="" itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"
				style="overflow: visible;" open="">
				<div class="collapsible__content text-container" itemprop="text">
					<p>1. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
						labore et dolore magna aliqua</p>
				</div>
			</collapsible-content>
		</div>
		<div class="faq__item" itemscope="" itemprop="mainEntity" itemtype="https://schema.org/Question">
			<button is="toggle-button" class="collapsible-toggle text--strong"
				aria-controls="block-template--18681112592652__faq-38d0d4d0-5a0b-4ba0-a733-8326f46abeef" aria-expanded="false"
				itemprop="name">2. Question: Dolor sit amet<span class="animated-plus"></span>
			</button>

			<collapsible-content id="block-template--18681112592652__faq-38d0d4d0-5a0b-4ba0-a733-8326f46abeef"
				class="collapsible anchor" itemscope="" itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"
				style="overflow: hidden;">
				<div class="collapsible__content text-container" itemprop="text">
					<p>2. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
						labore et dolore magna
						aliqua</p>
				</div>
			</collapsible-content>
		</div>
		<div class="faq__item" itemscope="" itemprop="mainEntity" itemtype="https://schema.org/Question">
			<button is="toggle-button" class="collapsible-toggle text--strong"
				aria-controls="block-template--18681112592652__faq-04c7cdf4-44b6-454c-9f88-8ecab2ab380a" aria-expanded="false"
				itemprop="name">3. Question: Dolor sit amet<span class="animated-plus"></span>
			</button>

			<collapsible-content id="block-template--18681112592652__faq-04c7cdf4-44b6-454c-9f88-8ecab2ab380a"
				class="collapsible anchor" itemscope="" itemprop="acceptedAnswer" itemtype="https://schema.org/Answer">
				<div class="collapsible__content text-container" itemprop="text">
					<p>3. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
						labore et dolore magna
						aliqua</p>
				</div>
			</collapsible-content>
		</div>
	</div>
</div>

Here is how I run it:

cat faq.html | trafilatura --formatting --links

The received result:

1. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
3. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua

There seems to be also a small bug, because it extracts the first and third answer but omits the second answer: 2. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua

That's the result I would like to get:

## FAQs
1. Question: Dolor sit amet
1. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
2. Question: Dolor sit amet
2. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
3. Question: Dolor sit amet
3. Answer: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua

The FAQ elements contain semantic information from schema.org, like itemtype="https://schema.org/Question" and other attributes like itemprop and itemscope. Maybe it is possible to implement a rule that keeps these semantic elements in the result?

zirkelc avatar Apr 23 '24 11:04 zirkelc

Hi, thanks for the detailed example, as you say this seems to be a bug (item 2), a potential enhancement (button), and a problem with the source at the same time (I think <collapsible-content> is not a valid HTML tag). I need to check what can reasonably be done here.

adbar avatar Apr 24 '24 09:04 adbar